console.log("20">10); //true
console.log("20a">"10"); //true
console.log("20a">10); //false
我想知道为什么最后一个变为假。 并且“20a”转换为比较前的内容。
答案 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)。这样 比较如下:
调用ToPrimitive(x,提示编号)。
- 醇>
调用ToPrimitive(y,提示编号)。
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。
因此,您要将NaN
与10
进行比较,任何涉及NaN
的比较都会返回false(或undefined
,请参阅下面的评论。)
答案 2 :(得分:0)
对于最后一种情况,请注意,即使"20a" < 10
返回false。这突出显示了"20a"
在比较期间对NaN
的评估,因为NaN
与任何数字相比总是返回false
。