根据JavaScript中null和undefined的区别是什么?,null和undefined是两个不同的对象(具有不同类型的)在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)
现在,作为==唯一匹配的价值,我想这两个undefined和null必须具有相同的价值.所以我尝试过:
alert(null) - >给 null
alert(undefined) - >给 undefined
我不明白这是怎么可能的.
这是演示.
编辑
我明白这===会给出预期的结果,因为undefined它null有不同的类型,但是在Javascript的情况下,类型转换是如何工作的==?我们可以像在Java中那样进行显式类型转换吗?我想上应用手动型转换undefined和null.
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.
console.log(5 == "5"); // true
console.log(5 === "5"); // false
Run Code Online (Sandbox Code Playgroud)
以上答案引用了Douglas Crockford的Javascript:The Good Parts:
["=="运算符在操作数相同时是正确的,但如果它们的类型不同,则会尝试强制执行这些值.他们这样做的规则是复杂和不可取的.
如果你不相信这些规则是复杂和不合理的,那么快速查看这些规则 就会使你失去这种观念.
undefined并且null 具有非常不同的语义含义。
undefined通常的意思是“没有任何回复”,null意思是“有回复,但回复什么都没有”。
例如,如果我创建了这个对象:
var gameState = {
state: loaded,
lastPlayer: null,
lastScore: null
};
Run Code Online (Sandbox Code Playgroud)
这并不意味着“我不知道最后一名球员是谁”,而是意味着“没有最后一名球员”。