2012-08-27 87 views
10

this MDN page,該delete關鍵字只有在財產存在,並且不能被刪除「delete」的返回值的真正含義是什麼?

返回false。在所有其他情況下,它 返回true。

但是,我看到delete回報true,儘管財產不被刪除的情況:

delete Window 
delete alert 
delete dir 
delete console 
delete 2 
delete null 
delete {}.x 
... 

事實上,幾乎與delete真正的window回報所有屬性,這可以從運行中可以看出在about:blank下面的腳本:

for(a in window) { if(delete window[a]) { console.log(a); } } 

然而,window大多數屬性做實際上並沒有被刪除。 delete返回值的真正含義是什麼?爲什麼它返回true它沒有刪除的屬性?

(注:我有興趣解釋delete行爲,鉻代碼引用)

+0

該行爲我輸出了不少名稱,然後禁用了jQuery,所以我不能這麼說。它似乎按預期工作。 –

+0

您是否嘗試過像「刪除窗口」等例子? – Randomblue

回答

8

窗口是host object,其語義由主機環境定義,例如,瀏覽器。 delete應用於主機對象的屬性比應用於本機對象時更爲複雜。

只要符合本文檔中所述的特定主機對象限制,主機對象可以支持這些內部屬性和任何依賴於實現的行爲。

Section 11.4.1 - The delete operator

If IsUnresolvableReference(ref) then, 
    If IsStrictReference(ref) is true, throw a SyntaxError exception. 
    Else, return true. 

所以當宿主對象不支持的屬性的缺失或修飾,那麼它將返回一個不可解決的引用或假裝要刪除的參考。兩種方法都會導致以非嚴格模式返回true

1

既然你是作用於你的程序的低級別對象,屬性實際上可以被刪除,然後立即重新添加,但我不知道如何測試這種行爲。

1

在該MDN頁面上,它指定了語法,其中不包括delete object作爲第一組示例使用的語法。它會在第二個示例中指定語法delete object[property]。但是,未指定DOM(主機)對象發生的情況。請參閱this article for more information

0

基本上,瀏覽器正在保護瀏覽器的運行時環境,在您的測試中。

曾幾何時,可能不會一直如此,但據測試去,這是類似於問爲什麼Windows不允許你打開命令shell並運行:

> cd/
> deltree *.* 

了。

因爲確實沒有什麼好的理由可以做這樣的事情,所以當你期望環境實際上繼續運行之後,而不是把整個瀏覽器取下來,再加上潛在的操作系統實例您當前正在運行,或者當您基本上要求程序實時清除自己時,可能會發生其他任何有趣的錯誤,而當前它可以低級別訪問GPU /聲卡/輸入設備。

刪除將嘗試刪除var時返回失敗。就瀏覽器需要運行的全局屬性而言,它們中的大多數屬性都被定義爲屬性(即:window.location),但在低級別(即:您無權訪問)中完成。所以從理論上講,它們是可以刪除的對象。但他們受到保護,所以你不能,但這不會改變delete的返回聲明,因爲這會改變delete的預期行爲。

所以:

function() { 
    var obj = { prop : true }; 
    delete obj; /* fail */ 
    delete object.prop; /* succeed */ 
} 
2

通過瀏覽器使用JavaScript實現一直是彎曲的規則。部分javascript DOM API甚至在純javascript中不可行,例如dom innerHTML =「something」觸發事件。這在EcmaScript5中已得到修復,但您不能依賴瀏覽器對象模型作爲100%合法的JavaScript。 AFAIK,只要你沒有把腳放入DOM和BOM中,你可以完全依靠ecmascript標準。

相關問題