Twitterにこんなつぶやきがあります。
JavaScript では、すべてのオブジェクトが真です (仕様による)。DOM では、この規則には 1 つの例外があります。それは何ですか?#jsquiz #fronttrends
誰も答えを知っていますか?
Twitterにこんなつぶやきがあります。
JavaScript では、すべてのオブジェクトが真です (仕様による)。DOM では、この規則には 1 つの例外があります。それは何ですか?#jsquiz #fronttrends
誰も答えを知っていますか?
免責事項: 私はそれをツイートした男です:)それは、フロントトレンドの講演で私が尋ねて答える質問でした. あのツイートはステージに上がる5分前に書きました。
Twitter は 140 文字の制限があるため、質問は少しあいまいです。私が尋ねていた本当の質問は次のとおりです。
ECMAScript 仕様では、次のように定義ToBoolean()
されています。
ご覧のとおり、すべての非プリミティブ オブジェクト (つまり、ブール値、数値、文字列、undefined
またはではないすべてのオブジェクトnull
) は、仕様に従って真です。ただし、DOM には、これに対する例外が 1 つあります。偽の DOM オブジェクトです。それがどれだか知っていますか?答えはdocument.all
です。HTML仕様には次のように書かれています:
all
属性は、フィルターがすべての要素に一致HTMLAllCollection
するノードをルートとするものを返す必要があります。Document
すべてに対して返されるオブジェクトには、いくつかの異常な動作があります。
ユーザー エージェントは、JavaScript の演算子が返されたオブジェクトを値
ToBoolean()
に変換するかのように動作する必要があります。all
false
ユーザー エージェントは 、JavaScriptの
==
and演算子の目的のために、返されるオブジェクトが値と等しいかのよう に動作する必要があります。!=
all
undefined
ユーザー エージェントは
typeof
、JavaScript の演算子が'undefined'
に対して返されたオブジェクトに適用されたときに 文字列を返すように動作する必要がありますall
。これらの要件は、執筆時点で最新の JavaScript 仕様 (ECMAScript エディション 5) に故意に違反しています。JavaScript 仕様では、
ToBoolean()
オペレーターがすべてのオブジェクトを値に変換する必要があり、オブジェクトが特定のオペレーターの目的であるtrue
かのように動作するための規定はありません。undefined
この違反は、レガシー コンテンツの 2 つのクラスとの互換性への欲求によって動機付けられています。1 つは、document.all
レガシー ユーザー エージェントを検出する方法として の存在を使用し、もう 1 つは、それらのレガシー ユーザー エージェントのみをサポートし、document.all
最初にその存在をテストせずにオブジェクトを使用します。 .
したがって、document.all
この ECMAScript ルールの唯一の公式な例外です。(Operadocument.attachEvent
などでも誤りですが、どこにも明記されていません。)
OK、このコードを使用します
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
ですdocument.all
。
これは非標準なので、を使用することをお勧めしますdocument.getElementsByTagName("*")
。
ドキュメントをループして、すべてをテストするだけです..
EDIT:間違ったテスト方法論、ありがたいことに誰かが指摘してくれて、私はそれを修正することができました.