8
console.log("20">10);  //true 
console.log("20a">"10");  //true 
console.log("20a">10);  //false

最後のものがなぜ間違っているのか知りたいです。そして、「20a」は比較する前に何に変換されます。

4

3 に答える 3

7

比較演算子の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を返します。

于 2012-10-12T08:58:10.950 に答える
2

ECMAScriptの比較アルゴリズムについては、ここで説明しています:http: //bclary.com/2004/11/07/#a-11.8.5

x <y(xとyは値)の比較では、true、false、またはundefinedが生成されます(これは、少なくとも1つのオペランドがNaNであることを示します)。このような比較は次のように実行されます。

  1. ToPrimitive(x、ヒント番号)を呼び出します。

  2. 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、以下のコメントを参照してください)。

于 2012-10-12T09:00:54.637 に答える
0

最後のケースでは、"20a" < 10falseを返すことにも注意してください。これは、任意の数が常にを返すのと比較して、比較中の"20a"atの評価を強調しています。NaNNaNfalse

于 2012-10-12T09:02:25.353 に答える