null和未定义的不一致比较
null and undefined inconsistent comparison
我很想知道的原因
null == undefined
返回true
,但返回
null >= undefined
返回false
包含大于运算符是否强制值不同?
tl;dr在这种情况下,>=
最终将两个参数强制为数字:undefined
被强制为NaN
,而null
被强制为不相等的0
。对于==
,规范明确定义null == undefined
是true
。
事实上,在这两种情况下,值都是被强制的(至少在某种意义上——==
的情况很特殊)。让我们在规范的帮助下,一次一个地考虑它们
>=
运算符的算法使用了其他关系运算符共享的"抽象关系比较算法"。从规范中的描述中,我们可以看到该算法执行以下操作:
- 将参数转换为基元(
null
和undefined
已经是基元) - 检查参数是否为
String
s(事实并非如此) - 如果它们不是
String
s,则算法将参数转换为数字(请参见步骤3.a.和3.b.)并与结果进行比较
最后一点是关键。从ToNumber
表中,我们看到undefined
被强制为NaN
,并且算法认为与NaN
的任何比较都是错误的(参见步骤3.c.和3.d.)。因此,null >= undefined
就是false
。
对于另一种情况==
,情况实际上要简单得多:规范明确指出null == undefined
是真的,这是"抽象等式比较算法"的一部分(参见步骤2。因此,null == undefined
就是true
。
在JS ==
中,运算符将值强制为相同类型进行比较,因此1=="1"
就是true
。使用===
运算符精确匹配
相关文章:
- 当属性不一致时,如何根据属性对JS对象列表进行排序
- Android和JavaScript解析API之间不一致
- Javascript的行为与PHP包含文件不一致
- 对这种与document.domain和CORS相关的不一致行为的解释是什么
- 点击链接行为不一致
- Passport.js`isAuthenticated()`不一致的行为;当它应该是真的时候是假的
- 与显示不一致
- Ext 4.2.1 模型日期解析在浏览器之间不一致
- 通过 Dropbox API 上传时的文件内容不一致
- JavaScript - 对象属性不一致
- Javascript 混淆了 null、instanceof 和 typeof 的语法不一致
- localeCompare 显示使用前导变音字符对单词进行排序时不一致的行为
- SVG 对象部分上的 JQuery click() 不一致
- 使用forEach和.shift()时结果不一致
- Window.open浏览器的高度不一致
- 捕获异常,而不是比较性能的数组值
- 不同浏览器中的LinkButton PageMethod行为不一致
- JavaScript 比较运算符中的不一致
- 比较Javascript中的日期-结果不一致
- null和未定义的不一致比较