检查JavaScript删除功能的支持

6
在 Javascript 中,您可以使用 delete 删除对象属性:
var o = { x: 1, y: 2 };

var wasDeleted = delete o.x;

现在,o.x 应该是 undefined,并且 wasDeletedtrue
但是,您只能删除本机对象,不幸的是,浏览器似乎对此有不同的想法:
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之前检查浏览器是否支持它?

也就是说,我能否确定属性被浏览器视为hostnative


主机对象(例如window)不需要像本地对象(如Object的实例)一样运作。在处理主机对象(例如DOM对象)时,应使用该对象接口中指定的方法,因为删除主机对象的属性可能会产生语言(ECMAScript)规范中未考虑的重大后果(例如删除输入元素的checked属性)。 - RobG
@RobG 我明白,奇怪的是(仅在IE6-8中),window.o.x被认为是本地属性,而window.o被认为是主机属性。我想做的是检测(无需使用try-catch)浏览器认为它是哪一个。 - Keith
1个回答

2

delete是基本的JavaScript语言特性,也被IE6-8所支持。只是这些遗留浏览器对删除不可变本地/宿主对象属性有不同的处理方式。恐怕只有使用try-catch语句才能解决此问题。


我有点想到了这样的情况 - 很奇怪的是,你可以无意中扩展一个“主机”对象(甚至只是忘记使用var),但全局属性却是“主机”而不是“本地”的。至少应该有一种方法来检测到这一点。 - Keith
@keith - 这是一个非常特殊的情况。这是一种语言特性,将值赋给未定义的变量会创建全局对象的属性。DOM中有一个window对象,它几乎可以看作是全局对象的别名,这也是DOM的一个特性。 - RobG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接