End*_*age 21 javascript ecmascript-5
因此,在javascript中对null和undefined的实现进行大讨论/辩论/讨论之后,我想让某人解释实现背后的原因以及它们在某些情况下的不同之处.我发现一些特别的问题令人不安:
null == undefined 评估为 truenull + 1等于1但undefined + 1相等NaNif(!null)计算结果为true并if(null)计算结果为false,但null == false计算结果为false.我已经阅读了规范并且我知道如何达到结果,我正在寻找规范这个规范的范例和原因.其中一些点,特别是第二点,给出第一点,感觉非常不一致.
zzz*_*Bov 11
简短而甜蜜的版本是Netscape团队非常迅速地设计和实现了JavaScript,它有一些不一致的地方,比如你已经指出的那些.
Internet Exploder团队尽力完全复制JS ,他们做得非常好,以至于不一致也被复制了.当Netscape将JS标准化时,因为ECMAScript MS是其中的一部分,并且基本上说他们不允许更改标准,因为它会破坏旧代码(现有系统惯性).不一致是标准化的,就是这样.
Douglas Crockford就其中一些问题进行了一系列非常好的讨论.
首先,尽管有很多语言在没有两种方法的情况下可以实现这种类似目的,但它们确实在Javascript中提供了不同但有些重叠的目的."为什么两者兼而有之?" 之前有人问过这个问题,我发现这个答案解释得相当好.TL; DR:Javascript具有某些语言函数,这些函数生成缺少值而不是非初始化值:
delete'价值观至于你问题中看似矛盾的问题,实际上很容易通过规范来解释. (我相信甚至可以说这种解释很优雅,尽管可能有些人会强烈反对.)
分别解决每个问题:
- null == undefined计算结果为true
请参阅此答案以获得最佳解释.简而言之,抽象平等比较规范表明它们(非严格地)相等.
- null + 1等于1但未定义+ 1等于NaN
运算符+既可以作为一元+(数字转换)运算符,也可以作为加法运算符,但两者都将参数路由到ToNumber规范,该规范说:
参数类型 - 结果
未定义 - NaN
Null - +0
Boolean - 如果参数为true,则结果为1.如果参数为false,则结果为+0.
Number - 结果等于输入参数(无转换).
换句话说,null + 1成为+0 + 1和undefined + 1成为NaN + 1,总是如此NaN.
- if(!null)计算结果为true,if(null)计算结果为false但null == false计算结果为false.
如您所知,!是Logical Not运算符,它对表达式执行ToBoolean 转换.这是一种截断.
该if声明(if (expr))执行上一个隐含的布尔比较EXPR.因此,请查看以上两个语句中的expr类型if:
if (!null):expr是!null给定逻辑非运算符(!)的结果,它是一个布尔值.if (null):EXPR是null,这意味着被执行任何转换.由于逻辑非运算符执行实际转换,同样的事情也会在其他情况下发生,并且实际上并不像您看起来那样是逻辑矛盾:
if (!"" == !undefined)= 真if ("" == undefined)= 假,当然.