字符串对象在比较时如何变换?

时间:2012-10-12 08:52:14

标签: javascript

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

我想知道为什么最后一个变为假。 并且“20a”转换为比较前的内容。

3 个答案:

答案 0 :(得分:7)

来自comparison operators上的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。

答案 1 :(得分:2)

ECMAScript中的比较算法在此处描述:http://bclary.com/2004/11/07/#a-11.8.5

  

比较x< y,其中x和y是值,产生true,false,   或undefined(表示至少有一个操作数是NaN)。这样   比较如下:

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

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

  4.         

    3.如果Type(Result(1))是String,Type(Result(2))是String,请转到步骤16.(注意,此步骤与算法中的步骤7不同   添加运算符+在使用而不是或。)

         

    4.Call ToNumber(Result(1))。

         

    5.Call ToNumber(结果(2))。

         

    ...

因此,如果是"20a">10,则javascript引擎必须将ToNumber应用于"20a"。完整的算法很复杂,但声明

  

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

因此,您要将NaN10进行比较,任何涉及NaN的比较都会返回false(或undefined,请参阅下面的评论。)

答案 2 :(得分:0)

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