4

在Javascript中你可以delete一个对象属性:检查支持JavaScript的删除功能

var o = { x: 1, y: 2 }; 

var wasDeleted = delete o.x; 

现在o.xundefinedwasDeletedtrue

但是你只能删除本地对象,不幸的是,浏览器似乎对这个有不同的想法:

window.x = 1; 

delete window.x; 

现在在Chrome和IE9-10 xundefined,但在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反对一个特定的对象之前它被称为?

I.e.我可以通过浏览器判断一个属性是否被认为是主机原生

+0

主机对象(如* window *)不需要像本地对象那样工作(如Object的实例)。在处理主对象(如DOM对象)时,应该使用该对象接口中指定的方法,因为删除主对象的属性可能会导致在语言(ECMAScript)规范中未考虑到的重大后果(例如,删除* checked *输入元素的属性)。 – RobG

+0

@RobG我明白了,奇怪的是(仅在IE6-8中)'window.o.x'被认为是本地属性,而'window.o'被认为是主机。我想要做的是检测(没有'try-catch')浏览器认为它是哪一个。 – Keith

回答

3

delete是一个基本的javascript语言功能,它也支持IE6-8。只是这些传统浏览器在删除不可变的本地/主机对象属性上有所不同。恐怕try-catch声明是您唯一的选择来解决这个问题。

+0

我有点像这样 - 你可以扩展一个_host_对象(意外事件,只是忘了'var'),但是那个全局属性是_host_而不是_native_。至少应该有一些方法来检测。 – Keith

+0

@基思 - 这是一个非常特殊的情况。这是一种语言功能,分配给未定义的变量创建全局对象的属性。这是DOM的一个特性,它有一个* window *对象,它或多或少是全局对象的别名。 – RobG