console.log("20">10); //true
console.log("20a">"10"); //true
console.log("20a">10); //false
最後のものがなぜ間違っているのか知りたいです。そして、「20a」は比較する前に何に変換されます。
console.log("20">10); //true
console.log("20a">"10"); //true
console.log("20a">10); //false
最後のものがなぜ間違っているのか知りたいです。そして、「20a」は比較する前に何に変換されます。
比較演算子のMDNページから:
リレーショナル抽象比較(例:<=)の場合、比較の前に、オペランドは最初にプリミティブに変換され、次に同じタイプに変換されます。
console.log("20">10); //true
"20"
これは数値に変換され、20
それを比較します。20
より大きいので、10
それは本当です。
console.log("20a">"10"); //true
これにより、2つの文字列が比較されます。"20a"
は(アルファベット順で)より大きいので"10"
、それは本当です。
console.log("20a">10); //false
これは数値に変換"20a"
されます。結果は次のとおりですNaN
(+"20a"
これが実際に動作することを確認してください)。NaN
はどの数値よりも大きくないため、falseを返します。
ECMAScriptの比較アルゴリズムについては、ここで説明しています:http: //bclary.com/2004/11/07/#a-11.8.5
x <y(xとyは値)の比較では、true、false、またはundefinedが生成されます(これは、少なくとも1つのオペランドがNaNであることを示します)。このような比較は次のように実行されます。
ToPrimitive(x、ヒント番号)を呼び出します。
ToPrimitive(y、ヒント番号)を呼び出します。
3. Type(Result(1))がStringで、Type(Result(2))がStringの場合、ステップ16に進みます(このステップは、加算演算子+のアルゴリズムのステップ7とは、代わりにを使用する点で異なることに注意してください。また。)
4.ToNumber(Result(1))を呼び出します。
5.ToNumber(Result(2))を呼び出します。
..。
したがって、の場合"20a">10
、javascriptエンジンはToNumberをに適用する必要があります"20a"
。完全なアルゴリズムは複雑ですが、次のように述べています
文法が文字列をStringNumericLiteralの展開として解釈できない場合、ToNumberの結果はNaNになります。
したがって、比較NaN
している10
場合、および関連する比較NaN
はfalseを返します(またはundefined
、以下のコメントを参照してください)。
最後のケースでは、"20a" < 10
falseを返すことにも注意してください。これは、任意の数が常にを返すのと比較して、比較中の"20a"
atの評価を強調しています。NaN
NaN
false