[英]All objects in JavaScript are truthy per the spec, but in the DOM one non-primitive object is not. Which?
免責聲明: 我是那個發推文的人:)這是我在前線趨勢談話中要求和回答的問題。 我在上台前5分鍾寫了推文。
由於Twitter上有140個字符的限制,這個問題有點含糊不清。 我問的真正問題如下。
ECMAScript規范定義了ToBoolean()
,如下所示 :
如您所見,所有非原始對象(即所有非布爾對象,數字,字符串, undefined
或null
)都符合規范。 但是,在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.