JavaScript关系比较运算符如何强制类型
How do the JavaScript relational comparison operators coerce types?
当操作数为不同类型时,JavaScript关系比较运算符适用哪些规则?
例如,如何评估true > null
?我可以在我的开发人员控制台中键入它,它会给出true
的结果,但为什么呢?
我搜索了一下,但没有找到任何解释这一点的博客文章,尽管有很多解释==和===比较运算符的类型强制的文章。
JavaScript关系比较运算符类型强制在JavaScript规范中进行了定义,特别是在描述运算符的11.8至11.8.5节以及描述强制操作数过程的9.1(ToPrimitive)和9.3(ToNumber)节中。
简而言之,4个比较运算符(<
、>
、<=
和>=
)尽其所能将每个操作数转换为一个数字,然后比较这些数字。例外情况是,当两个操作数都是字符串时,会按字母顺序进行比较。
具体而言,
-
如果参数
o
是一个对象而不是基元,请尝试通过调用o.valueOf()
将其转换为基元值,或者-如果o.valueOf
未定义或在调用时未返回基元类型-请通过调用o.toString()
-
如果两个参数都是String,请根据它们的字典顺序对它们进行比较。例如,这意味着
"a" < "b"
和"a" < "aa"
都返回true。 -
否则,将每个基元转换为一个数字,这意味着:
undefined
->NaN
Null
->+0Boolean
基元类型->如果true
则为1
,如果false
则为+0
String
->尝试解析字符串中的数字
-
然后,按照您对运算符的期望对每个项进行比较,但需要注意的是,任何涉及
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
相关文章:
- 在Resharper中禁用javascript类型强制警告
- BreezeJS / ODATA:只能对实体类型执行强制转换
- Javascript数组到布尔类型强制没有意义
- Javascript中的类型强制到底是什么
- JavaScript 类型强制首选项
- 在 Javascript 中,在对象到布尔的情况下,类型强制如何
- 如何在范围宽度内强制输入类型文本
- 将 MongoDB 文档强制转换为强类型类
- 双重不是(!!)与JavaScript中的类型强制
- 当 [] == false 时,类型强制是如何发生的
- Javascript filter() 是否默认执行类型强制
- 如果我在字符串上使用两个否定运算符,我是否使用类型强制
- 每次循环迭代强制转换为不同的类型
- 在Razor生成的隐藏字段上强制执行类型,在没有强制转换的JavaScript中接收变量
- 如何强制移动浏览器拉出数字键盘进行输入类型=“”;文本”;
- 使用类将JSON对象强制转换为typescript类型的变量的正确方法
- 未捕获的类型错误:不能调用方法'push'未定义的(d3强制布局)
- 如何在javascript和react中强制对象属性类型
- 猫鼬没有使用模型save()强制类型
- JavaScript关系比较运算符如何强制类型