最近在看《JavaScript高级程序设计》一书,在第二章第9小节一元运算符中讲到:
delete运算符不能删除开发者未定义的属性和方法,例如,下面的代码将引发错误:
delete o.toString;
即使toString是有效的方法名,这行代码也会引发错误,因为toString()方法是原始的ECMAScript方法,不是开发者定义的。(《JavaScript高级程序设计》中文版p29)
但我测试的结果却不是这样的,我的测试代码如下:
1 var o=new Object;
2 o.name="cnblogs";
3 o.show=function(){
4 return "cnblogs";
5 };
6 console.log(o);
7 delete o.name;
8 delete o.show;
9 console.log(o);
10 delete o.toString;
11 console.log(o);
结果如下:
大家可以看到左边的输出,没有出错。
这是书里讲的有问题呢,还是FireFox中的JS实现没有遵循ECMAScript标准呢,请高手指点。
ECMAScript标准是:“delete运算符不能删除开发者未定义的属性和方法",而不是“delete运算符删除开发者未定义的属性和方法时要引发错误”。
在Firefox中(Chrome也一样),delete o.toString 没有产生作用{也就是没有删除toString,通过console.log(o.toString);可以看出来},也没有引发错误。
我觉得这样不仅遵循了ECMAScript标准,而且有更好的用户体验。
嗯,应该是FireFox优化过,没有删除toString方法也没有报错。这种做法值得借鉴