JavaScript 关系比较运算符如何强制类型?
Posted
技术标签:
【中文标题】JavaScript 关系比较运算符如何强制类型?【英文标题】:How do the JavaScript relational comparison operators coerce types? 【发布时间】:2013-01-19 05:16:15 【问题描述】:当操作数属于不同类型时,javascript 关系比较运算符适用哪些规则?
例如,如何评估true > null
?我可以在我的开发者控制台中输入它,它会给出结果true
,但为什么呢?
我搜索了一下,但没有找到任何解释这一点的博客文章,尽管有很多解释 == 和 === 比较运算符的类型强制。
【问题讨论】:
亲爱的投票者,请注意 *** explicitly encourages asking and answering your own questions,所以我希望能得到一些反馈,解释为什么我的问题收到了反对票,而我的答案却收到了赞成票 :-) 你的回答很好。你的问题……没那么多。请记住,确实鼓励自己回答问题,但要正确回答问题部分很难。如果您的问题质量不高且没有标记为社区 wiki,那么它很可能会被否决甚至关闭。请参阅meta.stackexchange.com/questions/163623/…,了解您可以采取哪些措施来遏制这种情况。 我不会投反对票,但是,我想看看您对此的回答:您如何提出这样的问题,不到 1 分钟后您给出了详细而完整的答案?你真的有疑问吗? 我不是反对者之一,但我认为这个问题太笼统了。编辑后稍微好一点,现在可以阅读为对null > true
案例的解释请求。这更像是 Stack Overflow 式的。
@Ark,这并不重要,您可以发布您已经知道答案的问题。然而,问题的质量在这里至关重要。
【参考方案1】:
JavaScript 关系比较运算符类型强制在 JavaScript specification 中定义,特别是在描述运算符的部分 11.8 to 11.8.5 以及描述强制操作数的过程的部分 9.1 (ToPrimitive) 和 9.3 (ToNumber) 中。
简而言之,4 个比较运算符(<
、>
、<=
和 >=
)尽最大努力将每个操作数转换为数字,然后比较数字。例外情况是两个操作数都是字符串,在这种情况下它们按字母顺序进行比较。
具体来说,
如果参数 o
是对象而不是原始类型,则 try to convert it to a primitive value 通过调用 o.valueOf()
或 - 如果 o.valueOf
未定义或调用时未返回原始类型 - 通过打电话给o.toString()
如果两个参数都是字符串,则根据它们的lexicographical ordering 进行比较。例如,这意味着"a" < "b"
和"a" < "aa"
都返回true。
否则convert each primitive to a number,表示:
undefined
-> NaN
Null
-> +0
Boolean
原始类型 -> 1
if true
, +0
if false
String
-> try to parse a number 来自字符串
然后按照您对运算符的期望比较每个项目,但需要注意的是,任何涉及 NaN
的比较都会计算为 false
。
所以,这意味着以下内容:
console.log(true > null); //prints true
console.log(true > false); //prints true
console.log("1000.0" > 999); //prints true
console.log(" 1000\t\n" < 1001); //prints true
var oVal1 = valueOf: function() return 1; ;
var oVal0 = toString: function() return "0"; ;
console.log(oVal1 > null); //prints true
console.log(oVal0 < true); //prints true
console.log(oVal0 < oVal1); //prints true
【讨论】:
以上是关于JavaScript 关系比较运算符如何强制类型?的主要内容,如果未能解决你的问题,请参考以下文章