源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

javascript中的delete使用详解

  • 时间:2020-02-13 07:53 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:javascript中的delete使用详解
在这篇文章中作者从《JavaScript面向对象编程指南》一书中关于 delete 的错误讲起,详细讲述了关于 delete 操作的实现, 局限以及在不同浏览器和插件(这里指 firebug)中的表现。 下面翻译其中的主要部分。 ...书中声称 “函数就像一个普通的变量那样——可以拷贝到不同变量,甚至被删除” 并附上了下面的代码片段作为说明:
[url=https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/delete_Operator]MDN[/url]]) 的资源大概是这其中最详细的了,但不幸的是它遗漏了一些有趣的细节,这些细节中就包括了上述 firebug 的奇怪表现。[url=http://msdn.microsoft.com/en-us/library/2b2z052x%28VS.85%29.aspx]MSDN[/url] 文档几乎没什么用处。 [b]一、理论 | Theory [/b]那么,为什么我们能删除一个对象的属性:
[url=http://kangax.github.com/jstests/delete_compliance_test/]简单的测试单元[/url]来检查全局代码、函数代码和Eval代码的遵守情况。 测试单元同时检测了 delete 操作的返回值和属性是否像预期那样被删除。 delete 的返回值并不像它的实际结果那样重要,delete 操作返回 true 或 false 并不重要, 重要的是拥有/没有 DontDelete 的属性是否被删除。 现代浏览器总的来说还是遵守删除规则的,以下浏览器全部通过测试: Opera 7.54+, Firefox 1.0+, Safari 3.1.2+, Chrome 4+。 Safari 2.x 和 3.0.4 在删除函数 arguments 时存在问题,似乎这些属性在创建时不带 DontDelete,因此可以被删除。 Safari 2.x 还有其他问题——删除无引用时(例如delete 1)抛出错误(译者按:IE 同样有); 函数声明生成了可删除的属性(奇怪的是变量声明则正常); eval 中的变量声明变成不可删除(而 eval 中的函数声明则正常)。 与 Safari 类似,Konqueror(3.5,而非4.3)在 delete 无引用和删除 arguments 是也存在同样问题。 3.1、Gecko DontDelete bug Gecko 1.8.x 浏览器—— Firefox 2.x, Camino 1.x, Seamonkey 1.x, etc. ——存在一个有趣的 bug:显式赋值值给一个属性能移除它的 DontDelete,即使该属性通过变量或函数声明而生成。
[url=https://groups.google.com/group/comp.lang.javascript/browse_thread/thread/22e6b2d147f57ee5/dda4dee3390fa71a]9 月我讨论了这个问题[/url],其中 [url=http://dhtmlkitchen.com/]Garrett Smith[/url] 认为在 IE 中全局变量对象(Global variable object)实现为一个 JScript 对象,而全局对象则由宿主对象实现。 我们能通过几个测试来在某种程度上确认这一理论。 注意,this 和 window 似乎引用同一个对象(如果 ‘==='运算符可以信任的话), 而变量对象 Variable object (函数声明的基础)则与 this 引用的不同。
[url=http://stackoverflow.com/questions/1596782/how-to-unset-a-javascript-variable/1596889#1596889]Stackoverflow 上的一个答案[/url](而且等级还很高),里面解释说“delete is supposed to be no-op when target isn't an object property”。 现在我们了解了 delete 操作的核心,也就清楚了这个答案是不正确的。 delete 不区分变量和属性(事实上在 delete 操作中这些都是引用),而只关心 DontDelete(以及属性是否已经存在)。 [b]六、'delete'和宿主对象 | 'delete‘ and host object[/b] 一个 delete 的算法大致像这样: 1. 如果运算元(operand)不是引用,返回 true 2. 如果对象没有同名的**直接属性**,返回 true (如我们所知,对象可以是全局对象也可以是活化对象) 3. 如果属性已经存在但有 DontDelete,返回 false 4. 否则,删除移除属性并返回 true 然而,对于宿主对象(host object)的 delete 操作的行为却可能是不可预料的。 而事实上这并没有错:宿主对象(通过一定规则)允许实现任何操作, 例如读(内部[[Get]]方法)、写(内部[[Write]]方法)、删除(内部[[Delete]]方法),等等。 这种允许自定义[[Delete]]行为导致了宿主对象的混乱。 我们已经看到了在IE中的一些问题:当删除某些对象(那些实现为了宿主对象)属性时抛出异常。 一些版本的 firefox 当试图删除 window.location 时抛出异常(译者按:IE 同样抛出)。 同样,在一些宿主对象中你也不能相信 delete 的返回值, 例如下面发生在 firefox 中的(译者按:chrome 中同样结果;IE 中抛出异常;opera 和 safari 允许删除,并且删除后无法调用,姑且算'正常‘,尽管,从下面的讨论来看似乎却是不正常的,它们事实上删除了不能删除的属性,而前面的浏览器没有):
[url=https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/delete_Operator#section_5]MDC/MDN 上的文章[/url]或阅读规范然后自己测试。 下面是关于 Javascript 中 delete 如何工作的一个简单的总结: •变量和函数声明都是活化(Activation)全局(Global)对象的属性。 •属性拥有内部属性,其中一个—— DontDelete 负责确定一个属性是否能够被删除。 •全局代码或函数代码中的变量、函数声明都生成拥有 DontDelete 的属性。 •函数参数同样是活化对象的属性,也拥有 DontDelete。 •Eval代码中的变量和函数声明都生成没有 DontDelete 的属性。 •新的未声明的属性在生成时带空的内部属性,因此也没有 DontDelete。 •宿主对象允许以任何它们期望的方式来响应删除过程。 原文:[url=http://perfectionkills.com/understanding-delete/]Understanding delete[/url]译文:[url=http://justjavac.iteye.com/blog/1685559]javascript 中的 delete[/url]译者:[url=http://weibo.com/justjavac]justjavac[/url]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部