10

オペランドの型が異なる場合、JavaScript 関係比較演算子にはどのような規則が適用されますか?

たとえば、どのようにtrue > null評価されますか?これを開発者コンソールに入力すると、結果trueが表示されますが、なぜですか?

少し検索しましたが、これを説明するブログ投稿は見つかりませんでしたが、== および === 比較演算子の型強制について説明している記事はたくさんあります。

4

1 に答える 1

23

JavaScript リレーショナル比較演算子の型強制はJavaScript 仕様で定義されています。特に、セクション11.8 から 11.8.5で演算子について説明し、セクション9.1 (ToPrimitive)および9.3 (ToNumber)でオペランドを強制するプロセスについて説明しています。

つまり、4 つの比較演算子 ( <><=、および>=) は、各オペランドを数値に変換し、数値を比較するために最善を尽くします。例外は、両方のオペランドが文字列の場合で、この場合はアルファベット順に比較されます。

具体的には、

  1. 引数oがプリミティブではなくオブジェクトである場合は、呼び出してプリミティブ値に変換するか、o.valueOf()定義o.valueOfされていないか、呼び出されたときにプリミティブ型を返さなかった場合は、呼び出してo.toString()

  2. 両方の引数が文字列の場合は、それらの辞書順に従って比較します。たとえば、これは"a" < "b""a" < "aa"の両方が true を返すことを意味します。

  3. それ以外の場合は、各プリミティブを number に変換します。つまり、次のようになります。

  4. 次に、演算子に期待されるように各項目を比較NaNfalseます。

したがって、これは次のことを意味します。

console.log(true > null);           //prints true
console.log(true > false);          //prints true
console.log("1000.0" > 999);        //prints true
console.log("  1000\t\n" < 1001);   //prints true

var oVal1 = { valueOf: function() { return 1; } };
var oVal0 = { toString: function() { return "0"; } };

console.log(oVal1 > null);         //prints true
console.log(oVal0 < true);         //prints true
console.log(oVal0 < oVal1);        //prints true
于 2013-02-04T13:33:36.573 に答える