オペランドの型が異なる場合、JavaScript 関係比較演算子にはどのような規則が適用されますか?
たとえば、どのようにtrue > null
評価されますか?これを開発者コンソールに入力すると、結果true
が表示されますが、なぜですか?
少し検索しましたが、これを説明するブログ投稿は見つかりませんでしたが、== および === 比較演算子の型強制について説明している記事はたくさんあります。
オペランドの型が異なる場合、JavaScript 関係比較演算子にはどのような規則が適用されますか?
たとえば、どのようにtrue > null
評価されますか?これを開発者コンソールに入力すると、結果true
が表示されますが、なぜですか?
少し検索しましたが、これを説明するブログ投稿は見つかりませんでしたが、== および === 比較演算子の型強制について説明している記事はたくさんあります。
JavaScript リレーショナル比較演算子の型強制はJavaScript 仕様で定義されています。特に、セクション11.8 から 11.8.5で演算子について説明し、セクション9.1 (ToPrimitive)および9.3 (ToNumber)でオペランドを強制するプロセスについて説明しています。
つまり、4 つの比較演算子 ( <
、>
、<=
、および>=
) は、各オペランドを数値に変換し、数値を比較するために最善を尽くします。例外は、両方のオペランドが文字列の場合で、この場合はアルファベット順に比較されます。
具体的には、
引数o
がプリミティブではなくオブジェクトである場合は、呼び出してプリミティブ値に変換するか、o.valueOf()
定義o.valueOf
されていないか、呼び出されたときにプリミティブ型を返さなかった場合は、呼び出してo.toString()
両方の引数が文字列の場合は、それらの辞書順に従って比較します。たとえば、これは"a" < "b"
と"a" < "aa"
の両方が true を返すことを意味します。
それ以外の場合は、各プリミティブを number に変換します。つまり、次のようになります。
undefined
->NaN
Null
-> +0Boolean
プリミティブ型 -> 1
if true
、+0
iffalse
String
->文字列から数値を解析してみます次に、演算子に期待されるように各項目を比較NaN
しfalse
ます。
したがって、これは次のことを意味します。
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