根据What is the difference between null and undefined in JavaScript?,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
上述代码的输出是:
true
true
true
true
现在==
仅匹配该值,我认为undefined
和null
必须具有相同的值。所以我试过了:
alert(null)
- >给出null
alert(undefined)
- >给出undefined
我不明白这是怎么回事。
这是the demo。
修改
我了解===
会给出预期的结果,因为undefined
和null
有不同的类型,但在==
的情况下,类型转换在Javascript中如何工作?我们可以像在Java中那样进行显式类型转换吗?我想在undefined
和null
上应用手动类型转换。
答案 0 :(得分:19)
您需要使用identity operator ===
, not the equality operator ==
。通过此更改,您的code works as expected:
alert(a===null); // true
alert(a===undefined); // false
alert(b===null); // false
alert(b===undefined); // true
在这种情况下,等于运算符失败的原因是它尝试进行类型转换。 undefined
的类型为undefined
,null
的类型为object
;在尝试比较两者时,Javascript将两者都转换为false
,这就是为什么它最终认为它们相等。另一方面,身份运算符不进行类型转换,并且要求类型等于结束相等。
修改 感谢@ user1600680指出,上述情况并不完全正确; ECMAScript规范将null-to-undefined定义为特殊情况,并且相等。没有中间转换为false
。
<小时/> 类型转换的一个更简单的例子是数字到字符串:
console.log(5 == "5"); // true
console.log(5 === "5"); // false
上面的答案引用了Douglas Crockford的 Javascript:The Good Parts :
[“==”运算符]在操作数类型相同时是正确的,但如果它们的类型不同,则会尝试强制执行这些值。他们这样做的规则是复杂和不可取的。
如果你不相信规则是复杂且不可取的,那么quick look at those rules 会破坏你的想法。
答案 1 :(得分:4)
undefined
和null
具有非常不同的语义含义。
undefined
通常意味着&#34;没有任何回复&#34; null
表示&#34;有回复,回复什么都没有。&#34;
例如,如果我创建了这个对象:
var gameState = {
state: loaded,
lastPlayer: null,
lastScore: null
};
这并不意味着&#34;我不知道最后一名球员是谁?#34;相反,它意味着&#34;没有最后一名球员。&#34;
答案 2 :(得分:2)
为澄清之前的回答,==
以这种方式运作的原因是,与===
不同,type conversion
答案 3 :(得分:2)
var a;
var b = null;
a未定义,b完全为空。
==
用于以有意松散的方式比较相等性,这通常是有用的
alert("3" == 3.0);
这给了我们true
虽然他们明显不同 - 一个是数字,一个是字符串。
很多时候,这很棒。
同样地,很多时候不关心某些东西是否因为未定义而没有实际价值,或者因为它被明确设置为null。
虽然有时有用,但我们有时也需要知道确切的类型匹配以及值,因此我们也有===
。
答案 4 :(得分:2)
我还想说undefined
与typeof
一起使用。
比较必须如下:
if( typeof(b)=="undefined" ){}
提供与
相同的结果if( b === undefined ){}
我已在您的代码http://jsfiddle.net/A89Qj/5/
中加入了这些额外的测试答案 5 :(得分:1)
您需要使用===而不是==。 ===运算符的行为与==运算符的行为相同,只是它不进行任何类型转换。
答案 6 :(得分:0)
typeof undefined是未定义的,但null的类型是object。 null === undefined会给你假。 但是null == undefined会给你真实的。 因为boh具有不同的数据类型但具有相同的值。