在 Javascript 中,您可以
delete
对象属性:
var o = { x: 1, y: 2 };
var wasDeleted = delete o.x;
现在
o.x
应该是 undefined
并且 wasDeleted
是 true
。
但是,您只能删除本机对象,不幸的是,浏览器对此似乎有不同的想法:
window.x = 1;
delete window.x;
现在在 Chrome 和 IE9-10 中
x
将是 undefined
,但在 IE6-8 中这会引发异常:
“对象不支持此操作”
太棒了。请注意,这并不是说
delete
不受支持...
// Oops, no var, so this is now a global, should've 'use strict'
o = { x: 1, y: 2 };
// Works
delete o.x;
// Works
delete window.o.y;
// Fails, but only in IE6-8 :-(
delete window.o
我意识到我可以添加一个
try {...} catch
块,但是...
有什么方法可以在调用之前
检查浏览器是否支持针对特定对象的
delete
?
即我可以判断浏览器是否将某个属性视为 host 还是 native?
delete
是一个基本的javascript语言功能,IE6-8也支持。只是这些旧版浏览器在删除imutable 或 native / host 对象属性时的处理方式有所不同。恐怕
try-catch
声明是您解决此问题的唯一选择。
Object.prototype.propertyIsEnumerable()
在主机对象上使用时会引发以下 TypeError:
Object.prototype.propertyIsEnumerable:“this”不是 JavaScript 物体因此,下面的函数会告诉您在不先添加属性的情况下对对象使用delete是否会抛出异常。
function canUseDeleteOn(obj) {
try {
// throws on host objects in IE5-8
Object.prototype.propertyIsEnumerable.call(obj, 1);
return true;
}
catch(e) {
return false;
}
}
我知道这个问题已经很老了,你可能希望避免使用 try/catch,但晚总比不好,对吗?