2

これは、if ステートメントを簡略化して書く最初の試みですが、展開されたバージョンが私が想像していたように機能しない理由に困惑しています。

コード 1 - 機能しない

if(document.getElementById == true) {
        alert("The document object model is supported by: " + navigator.appName);   
    }

コード 2 - 機能する

if(document.getElementById != false) {
            alert("The document object model is supported by: " + navigator.appName);   
        }

コード 3 - 機能する省略形

 if(document.getElementById) {
            alert("The document object model is supported by: " + navigator.appName);   
        }

短縮形 in 3 を最初のコード サンプルに展開すると機能しないのはなぜ!= falseですか。

4

5 に答える 5

2

あなたの最初のif声明:

if(document.getElementById == true) {

... はdocument.getElementByIdオブジェクトの型である関数であり、オブジェクトは と等しくないため、機能しませんtrue

2 番目のifステートメント:

if(document.getElementById != false) {

...実際には機能しません-あなたはそれが機能すると思っていても-(私は推測しています)document.getElementByIdが定義されているブラウザでのみテストしたためです.getElementById。に等しくないfalseしかし.getElementByIdが定義されていない場合、 if テストは実質的にundefined != false どちらが である trueかをテストします。そのため、そのテストはあなたが思っていることをしていません。

3 番目のifステートメント:

 if(document.getElementById) {

...動作します。それが機能する理由は、JavaScript には「真」と「偽」の表現の概念があるからです。数値 0、空の文字列""undefinednullNaN、およびもちろんfalse、すべて「偽の」値です。ゼロ以外の数値、空でない文字列、およびオブジェクト (関数を含む) を含む、他のほとんどすべて「真実」です。ステートメント内の式ifが「真」の場合、if ブロックが実行されます。

(最後に、存在するかどうかをテストする必要はまったくありませdocument.getElementByIdん。JS を実行しているが、そのメソッドを定義していないブラウザーを見つけることができれば、私は驚くでしょう。)

于 2012-06-26T01:41:16.863 に答える
1

コード 1 は真実ですが、真実ではありません。getElementById はオブジェクトですが、ブール値ではないため、1 つと比較すると false になります。

真実性と偽りの概念を説明するブログは次のとおりです

于 2012-06-26T01:02:24.533 に答える
1

document.getElementByIdは存在する機能ですが、そうではありませんtrue。試してみてdocument.write(document.getElementById)、結果を確認してください。trueどちらも評価しませんfalse

実際の動作はこちら.

ブール値と比較する必要はないため、次のようにするのが最善です。

if(document.getElementById){
    //Do something
}
于 2012-06-26T01:00:09.580 に答える
1

typeofdocument.getElementByIdが「関数」であり、その値がブール値の「true」ではなくネイティブ コードであるため、最初の方法は機能しません。

再。3番目の例では、代わりにこれも試してください:

if (!!document.getElementById) ...

!!結果にブール型を強制します。

于 2012-06-26T01:06:54.140 に答える
0

ECMAScript仕様からの答えは次のとおりです。

ifステートメントを評価するためのプロシージャを見てください。ステップ 3 で、プロシージャは を呼び出しToBoolean、オブジェクトを値にキャストしますtrueToBoolean関数は、「真実」と「偽」の値の概念を取得する場所です。これらは、それぞれおよびによってキャストされる値ToBooleanです。truefalse

次に、演算子に使用される抽象等価比較演算を見てください==。のプロシージャ フローObject == booleanは、 の単純な呼び出しよりもはるかに複雑ですToBoolean。こんなふうになります:

For some comparison x == y...

1.  If Type(x) is different from Type(y), go to step 14.
19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).

(Go back to step 1, with the boolean cast to a Number by ToNumber[1], then...)

21. If Type(x) is Object and Type(y) is either String or Number, return
    the result of the comparison ToPrimitive(x)== y.

(ToPrimative[2] calls the object's toString method; now compare String == Number)

17. If Type(x) is String and Type(y) is Number, return the result of the
    comparison ToNumber(x)== y.

(ToNumber turns the string "function()..." into NaN. Finally...)

5. If x is NaN, return false

さらなる参考文献:

[1] ToNumber

[2]非常に長い[[DefaultValue]]を呼び出すToPrimative。幸いなことに、この場合はステップ 2 ですぐに解決します。

于 2012-06-26T03:12:08.907 に答える