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
这将比较两个字符串。因为"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 是值,产生真、假或未定义(这表明至少一个操作数是 NaN)。如下进行这样的比较:
调用 ToPrimitive(x, 提示号)。
调用 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
,请参阅下面的评论)。
对于最后一种情况,请注意,即使"20a" < 10
返回 false。这突出了在比较期间对"20a"
at的评估,与任何数字相比总是返回。NaN
NaN
false