Javascript教程:delete删除对象(5)

http://www.itjxue.com  2015-08-06 23:08  来源:未知  点击次数: 

浏览器兼容性

从理论上认识事物的工作原理是有用的,但实际影响是至关重要的。当涉及到variable/property creation/deletion时,浏览器遵循标准吗?在大多数是的。

我写了一个简单的测试包检测Global code、Function code 和Eval code代码delete 运算符的兼容性。测试包同时检查 -- delete运算符的返回值,以及应被删除的属性是否被删除的。delete 运算符返回truefalse并不重要,重要的是有DontDelete特性不被删除,反之亦然。

现代浏览器一般都相当兼容,除了这个我早期提到的这个eval特性。下面的浏览器完全通过测试包:Opera 7.54+、Firefox 1.0+、Safari 3.1.2+、Chrome 4+。

Safari 2.x 和3.0.4在删除函数参数时有些问题,这些属性似乎没有创建DontDelete,所以可以删除它们。Safari 2.x 甚至有更多问题,删除非引用(例如delete 1)抛出错误;函数声明创建了可删除属性(但奇怪是变量声明不是),在eval中的变量声明成为不可删除的(但函数声明不是)。

与Safari相似,Konqueror (3.5,但不是 4.3)当删除非引用(例如delete 1)抛出错误,它错误使函数参数可以删除。

Gecko DontDelete bug

Gecko 1.8.x浏览器--Firefox 2.x、 Camino 1.x、Seamonkey 1.x等显示一个有趣的bug:对一个属性明确地赋值可以删除它的DontDelete特性,即使该属性是通过变量或函数声明来创建的。

function foo(){} 
    delete foo;
// false (as expected) 
    typeof foo;
// "function" (as expected) 
  
    
/* now assign to a property explicitly */
  
    this.foo = 1;
// erroneously clears DontDelete attribute 
    delete foo;
// true 
    typeof foo;
// "undefined" 
  
    
/* note that this doesn't happen when assigning property implicitly */
  
    function
bar(){} 
    
bar = 1; 
    delete bar;
// false 
    typeof bar; // "number" (although assignment replaced property)

出乎意料的是,IE5.5 – 8全部通过测试包,删除非引用(例如delete 1)抛出错误(就像在老版的Safari一样)。但事实上有更严重bug存在IE中,这不会立即显现。这些bug都与全局对象相关。

(责任编辑:IT教学网)

更多

推荐Javascript/Ajax文章