10

Twitterにこんなつぶやきがあります。

JavaScript では、すべてのオブジェクトが真です (仕様による)。DOM では、この規則には 1 つの例外があります。それは何ですか?#jsquiz #fronttrends

誰も答えを知っていますか?

4

4 に答える 4

9

免責事項: 私はそれをツイートした男です:)それは、フロントトレンドの講演で私が尋ねて答える質問でした. あのツイートはステージに上がる5分前に書きました。


Twitter は 140 文字の制限があるため、質問は少しあいまいです。私が尋ねていた本当の質問は次のとおりです。

ECMAScript 仕様では、次のように定義ToBoolean()されています。

ToBoolean(条件)、Front-Trends 2012 トークからのスライド

ご覧のとおり、すべての非プリミティブ オブジェクト (つまり、ブール値、数値、文字列、undefinedまたはではないすべてのオブジェクトnull) は、仕様に従って真です。ただし、DOM には、これに対する例外が 1 つあります。偽の DOM オブジェクトです。それがどれだか知っていますか?答えはdocument.allです。HTML仕様には次のように書かれています:

all属性は、フィルターがすべての要素に一致HTMLAllCollectionするノードをルートとするものを返す必要があります。Document

すべてに対して返されるオブジェクトには、いくつかの異常な動作があります。

ユーザー エージェントは、JavaScript の演算子が返されたオブジェクトを値ToBoolean()に変換するかのように動作する必要があります。allfalse

ユーザー エージェントは 、JavaScriptの==and演算子の目的のために、返されるオブジェクトが値と等しいかのよう に動作する必要があります。!=allundefined

ユーザー エージェントはtypeof、JavaScript の演算子が'undefined'に対して返されたオブジェクトに適用されたときに 文字列を返すように動作する必要がありますall

これらの要件は、執筆時点で最新の JavaScript 仕様 (ECMAScript エディション 5) に故意に違反しています。JavaScript 仕様では、ToBoolean()オペレーターがすべてのオブジェクトを値に変換する必要があり、オブジェクトが特定のオペレーターの目的であるtrueかのように動作するための規定はありません。undefinedこの違反は、レガシー コンテンツの 2 つのクラスとの互換性への欲求によって動機付けられています。1 つは、document.allレガシー ユーザー エージェントを検出する方法として の存在を使用し、もう 1 つは、それらのレガシー ユーザー エージェントのみをサポートし、 document.all最初にその存在をテストせずにオブジェクトを使用します。 .

したがって、document.allこの ECMAScript ルールの唯一の公式な例外です。(Operadocument.attachEventなどでも誤りですが、どこにも明記されていません。)

于 2012-05-01T07:15:26.153 に答える
1

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
于 2012-04-27T13:27:17.327 に答える
1

ですdocument.all

これは非標準なので、を使用することをお勧めしますdocument.getElementsByTagName("*")

于 2012-04-27T10:36:28.460 に答える
0

ドキュメントをループして、すべてをテストするだけです..

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

EDIT:間違ったテスト方法論、ありがたいことに誰かが指摘してくれて、私はそれを修正することができました.

于 2012-04-27T10:56:49.760 に答える