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