0

本には、OR の次のルールが記載されています。

  • 最初のオペランドがオブジェクトの場合、最初のオペランドが返されます。
  • 最初のオペランドが false と評価された場合、2 番目のオペランドが返されます。
  • 両方のオペランドがオブジェクトの場合、最初のオペランドが返されます。
  • 両方のオペランドが null の場合、null が返されます。
  • 両方のオペランドが NaN の場合、NaN が返されます。
  • 両方のオペランドが未定義の場合、未定義が返されます。

ただし、コーディング中に次の動作が観察されました。

        var result18 = (NaNVar || undefinedVar);  //undefined
        var result19 = (NaNVar || nullVar);  //null
        var result20 = (undefinedVar || NaNVar);  //NaN
        var result21 = (undefinedVar || nullVar); //null
        var result22 = (nullVar || NaNVar); //NaN
        var result23 = (nullVar || undefined);   //undefined

これらのルールでこの動作を正当化するにはどうすればよいですか?

4

4 に答える 4

5

このルールが鍵です:

最初のオペランドが false と評価された場合、2 番目のオペランドが返されます。

左辺の値はすべて false と評価されるため、右辺が返されます。

役立つ場合は、MDN からの適切な定義を次に示します。

式1 || expr2

true に変換できる場合は expr1 を返します。それ以外の場合は expr2 を返します。したがって、ブール値で使用すると、|| いずれかのオペランドが true の場合は true を返します。両方が false の場合、false を返します。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Logical_Operators

于 2012-09-08T14:09:39.300 に答える
3

本の説明について混乱してすみません。私はエッジケースを列挙しようとしていましたが、それがどのように混乱を引き起こす可能性があるかがわかります。

2つのルールのみを使用して、操作を正確に説明できます。最初の引数が真である場合は、最初の引数を返します。最初の引数が偽の場合は、2番目の引数を返します。3番目のルールは、この演算子に適用されるだけではありません。宣言されていない変数を使用すると、使用しようとすると常に彼女がスローされます。何に使用しようとしても問題ありません(宣言されていない変数で正常に機能するtypeofとdeleteを除く)。

于 2012-09-09T16:21:06.520 に答える
2

あなたの本は、論理 OR 演算子を説明するのにひどい方法を選んでいます。

たとえば、このルールは制限が多すぎます。

最初のオペランドがオブジェクトの場合、最初のオペランドが返されます。

演算子は、いかなる種類の型チェックも行いません。第 1 オペランドまたは第 2 オペランドが「オブジェクト」であるかどうかは気にしません。それらがブール値にどのように強制されるかだけを気にします。

この例を見てください。

"foobar" || false

最初のオペランドはオブジェクトではなく文字列ですが、強制的に booleantrueになるため、最初のオペランドが返されます。

Boolean("foobar"); // true

あなたの本は、ある種の指定されたアルゴリズムに従っているかのように、箇条書きを歩いています。そのようなアルゴリズムはありません。比較は厳密にブール型強制に基づいています。

簡単に言えば、

  • オペランドを強制するものが見つかるまで、またはオペランドがなくなるまで、オペランドを左から右に評価しtrueます。
  • 評価された最後のオペランドが返されます (非強制)

11.11 二項論理演算子

  1. LogicalOREExpressionlrefを評価した結果とします。

  2. しましょlvalGetValue(lref)

  3. である場合ToBoolean(lval)true、 を返しlvalます。

  4. LogicalANDExpressionrrefを評価した結果とします。

  5. 戻るGetValue(rref)

于 2012-09-08T14:23:08.487 に答える
0

はい、結果を観察した後、2 つの単純なルールを結論付けました。

        //1: if the first operand evaluates to true then it is returned (here it means actual //value of operand is returned but not the evaluated value that is true)
        //following values evaluates to ture: non-empty string, non-zero number and //none of these values- NaN, null, undefined

        var result = ("Mahesh" || false) //"Mahesh"
        var result = ("Mahesh" || true) //"Mahesh"
        var result = ("Mahesh" || undefined) //"Mahesh"
        var result = ("Mahesh" || null) //"Mahesh"
        var result = ("Mahesh" || NaN) //"Mahesh"
        var result = (5 || false) //5
        var result = (5 || true) //5
        var result = (5 || null) //5
        var result = (5 || NaN) //5
        var result = (5 || undefined) //5

        //2: if first operand evaluates to false then the value of second operand is //returned, again without evaluating it
        //following values evaluate to false: empty string (""), number zero (0),  null, //NaN, undefined or false)

        var result = (false || NaN);  //NaN
        var result = (false || null);  //null
        var result = (false || undefined);  //undefined
        var result = (false || "Mahesh");  //Mahesh
        var result = (false || 5);  //5

        var result = (NaN || false);   //false
        var result = (NaN || true);   //true
        var result = (NaN || NaN);   //NaN
        var result = (NaN || null);  //null
        var result = (NaN || undefined);  //undefined
        var result = (NaN || "Mahesh");   //Mahesh
        var result = (NaN || 5);   //5

        var result = (null || false);  //false
        var result = (null || true);  //true
        var result = (null || NaN); //NaN
        var result = (null || null);  //null
        var result = (null || undefined);   //undefined
        var result = (null || "Mahesh");  //Mahesh
        var result = (null || 5);  //5

        var result = (undefined || false);  //false    
        var result = (undefined || true);  //true
        var result = (undefined || NaN);  //NaN
        var result = (undefined || null); //null
        var result = (undefined || undefined);  //undefined
        var result = (undefined || "Mahesh");  //Mahesh
        var result = (undefined || 5);  //5

        var result = (0 || false); //false
        var result = (0 || true); //true
        var result = (0 || NaN); //NaN
        var result = (0 || null);  //null
        var result = (0 || undefined);   //undefined
        var result = (0 || "Mahesh"); //Mahesh
        var result = (0 || 5); //5

        var result = ("" || false); //false
        var result = ("" || true); //true
        var result = ("" || NaN); //NaN
        var result = (""|| null);  //null
        var result = (""|| undefined);   //undefined
        var result = ("" || "Mahesh"); //Mahesh
        var result = ("" || 5); //5

        //Note: if the first operand evaluates to false and if the second operand is undeclared 
        //variable then it will cause an error
        var result = (false || undeclaredVar);    //error

もっと簡単な言葉で言えば、それがすべてだと思います。私が正しく理解しているかどうか、ここで誰でも確認できますか? 私は IE10 でこれを試しましたが、他のブラウザーでも一貫性があることを願っています。

于 2012-09-08T20:38:42.773 に答える