簡體   English   中英

JavaScript中的所有對象都符合規范,但在DOM中,一個非原始對象不是。哪一個?

[英]All objects in JavaScript are truthy per the spec, but in the DOM one non-primitive object is not. Which?

Twitter上這條推文

在JavaScript中,所有對象都是真實的(根據規范)。 在DOM中,此規則有一個例外。 它是什么? #jsquiz #fronttrends

有人知道答案嗎?

免責聲明: 我是那個發推文的人:)這是我在前線趨勢談話中要求和回答的問題。 我在上台前5分鍾寫了推文。


由於Twitter上有140個字符的限制,這個問題有點含糊不清。 我問的真正問題如下。

ECMAScript規范定義了ToBoolean() ,如下所示

ToBoolean(條件),從我的Front-Trends 2012演講中滑出

如您所見,所有非原始對象(即所有非布爾對象,數字,字符串, undefinednull )都符合規范。 但是,在DOM中,有一個例外 - 一個虛假的DOM對象。 你知道那是哪一個嗎? 答案是document.all HTML規范說:

all屬性必須返回以Document節點為根的HTMLAllCollection ,其過濾器匹配所有元素。

為所有人返回的對象有幾個不尋常的行為:

用戶代理必須表現得好像JavaScript中的ToBoolean()運算符將為all返回的對象轉換為false值。

對於JavaScript中的==!=運算符,用戶代理必須表現為為all返回的對象等於undefined值。

用戶代理必須采取行動,使得JavaScript中的typeof運算符在應用於為all對象返回的對象時返回字符串'undefined'

這些要求是在撰寫本文時故意違反JavaScript規范(ECMAScript第5版)。 JavaScript規范要求ToBoolean()運算符將所有對象轉換為true值,並且沒有為對象執行操作,就好像它們是為某些運算符的目的而undefined的那樣。 這種違規行為的動機是希望兼容兩類遺留內容:一種使用document.all作為檢測遺留用戶代理的方法,另一種只支持那些遺留用戶代理並使用document.all對象。沒有首先測試它的存在。

因此, document.all是此ECMAScript規則的唯一官方例外。 (在Opera中, document.attachEvent等也是假的,但是在任何地方都沒有。)

它是document.all

這是非標准的,所以你最好使用document.getElementsByTagName("*")

好的,使用這段代碼

for (var name in document) {
    if (!!document[name] === false && typeof document[name] === 'object' && document.hasOwnProperty(name)) {
        $('#foo').append('document.' + name + '<br />');        
    };
};​

我有這個結果鉻(結果可能會有所不同)

document.ownerDocument
document.attributes
document.namespaceURI
document.nextSibling
document.webkitCurrentFullScreenElement
document.nodeValue
document.preferredStylesheetSet
document.textContent
document.previousSibling
document.parentNode
document.xmlVersion
document.parentElement
document.localName
document.selectedStylesheetSet
document.prefix
document.xmlEncoding

只需循環文檔並測試所有..

http://jsfiddle.net/UTNkW/3/

編輯:錯誤的測試方法,謝天謝地有人指出,我可以糾正它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM