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

时间:2012-08-31 15:33:00

标签: javascript

根据What is the difference between null and undefined in JavaScript?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

上述代码的输出是:

true
true
true 
true

现在==仅匹配该值,我认为undefinednull必须具有相同的值。所以我试过了:

alert(null) - >给出null

alert(undefined) - >给出undefined

我不明白这是怎么回事。

这是the demo

修改

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

7 个答案:

答案 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的类型为undefinednull的类型为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)

undefinednull具有非常不同的语义含义。

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)

我还想说undefinedtypeof一起使用。 比较必须如下:

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具有不同的数据类型但具有相同的值。