JavaScript中的null和undefined之间的区别?

Ank*_*kur 17 javascript

根据JavaScript中null和undefined的区别是什么?,nullundefined是两个不同的对象(具有不同类型的)在Javascript.但是,当我尝试这个代码

var a=null;
var b;
alert(a==null);      // expecting true
alert(a==undefined); // expecting false
alert(b==null);      // expecting false
alert(b==undefined); // expecting true
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是:

true
true
true 
true
Run Code Online (Sandbox Code Playgroud)

现在,作为==唯一匹配的价值,我想这两个undefinednull必须具有相同的价值.所以我尝试过:

alert(null) - >给 null

alert(undefined) - >给 undefined

我不明白这是怎么可能的.

这是演示.

编辑

我明白这===会给出预期的结果,因为undefinednull有不同的类型,但是在Javascript的情况下,类型转换是如何工作的==?我们可以像在Java中那样进行显式类型转换吗?我想上应用手动型转换undefinednull.

McG*_*gle 19

您需要使用标识运算符===,而不是相等运算符==.通过此更改,您的代码按预期工作:

alert(a===null);      // true
alert(a===undefined); // false
alert(b===null);      // false
alert(b===undefined); // true
Run Code Online (Sandbox Code Playgroud)

在这种情况下,等于运算符失败的原因是它尝试进行类型转换.undefined属于类型undefined,null属于类型object; 在尝试比较两者时,Javascript将两者都转换为false,这就是为什么它最终认为它们相等.另一方面,身份运算符不进行类型转换,并且要求类型等于结束相等.

编辑 感谢@ user1600680指出,上面说的不太正确; ECMAScript规范将null-to-undefined定义为特殊情况,并且相等.没有中间转换false.


一个更简单的类型转换示例是number-to-string:

console.log(5 == "5");    // true
console.log(5 === "5");   // false
Run Code Online (Sandbox Code Playgroud)

以上答案引用了Douglas Crockford的Javascript:The Good Parts:

["=="运算符在操作数相同时是正确的,但如果它们的类型不同,则会尝试强制执行这些值.他们这样做的规则是复杂和不可取的.

如果你不相信这些规则是复杂和不合理的,那么快速查看这些规则 就会使你失去这种观念.

  • 虽然我同意你的答案基本上是有效的,但解释为什么在Javascript中展示这种行为可能不会有害;) (6认同)
  • 正如我所说,`null`和`undefined`除了`null`和`undefined`之外什么都不等.正如`null`等于`null`,`null`等于`undefined`,`undefined`等于`null`,`undefined`等于`undefined`.但是`null`或`undefined`等于`[任何其他值]`将是假的. (2认同)

Jer*_*her 5

undefined并且null 具有非常不同的语义含义。

undefined通常的意思是“没有任何回复”,null意思是“有回复,但回复什么都没有”。

例如,如果我创建了这个对象:

var gameState = {
  state: loaded,
  lastPlayer: null,
  lastScore: null
};
Run Code Online (Sandbox Code Playgroud)

这并不意味着“我不知道最后一名球员是谁”,而是意味着“没有最后一名球员”。