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的评估,与任何数字相比总是返回。NaNNaNfalse