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 

这将比较两个字符串。因为"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 是值,产生真、假或未定义(这表明至少一个操作数是 NaN)。如下进行这样的比较:

  1. 调用 ToPrimitive(x, 提示号)。

  2. 调用 ToPrimitive(y, 提示号)。

3.如果Type(Result(1))是String,Type(Result(2))是String,转到第16步。(注意这一步和第7步算法不同,加法运算符+用and代替或者。)

4.呼叫号码(结果(1))。

5.呼叫号码(结果(2))。

...

因此,在 的情况下"20a">10,javascript 引擎必须将ToNumber应用于"20a". 完整的算法很复杂,但指出

如果语法不能将字符串解释为 StringNumericLiteral 的扩展,则 ToNumber 的结果为 NaN。

因此,您正在比较NaN并且10任何涉及NaN返回 false 的比较(或undefined,请参阅下面的评论)。

于 2012-10-12T09:00:54.637 回答
0

对于最后一种情况,请注意,即使"20a" < 10返回 false。这突出了在比较期间对"20a"at的评估,与任何数字相比总是返回。NaNNaNfalse

于 2012-10-12T09:02:25.353 回答