17

根据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

上述代码的输出是:

true
true
true 
true

现在因为==只匹配值,我认为两者undefinednull必须具有相同的值。所以我尝试了:

alert(null)-> 给null

alert(undefined)-> 给undefined

我不明白这怎么可能。

这是演示

编辑

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

4

7 回答 7

19

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

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

[“==”运算符在操作数属于相同类型时是正确的,但如果它们属于不同类型,它们会尝试强制转换值。他们这样做的规则既复杂又难以忘怀。

如果您不相信这些规则是复杂且难以记住的,那么快速浏览一下这些规则 将会消除您的这种想法。

于 2012-08-31T15:34:17.003 回答
5

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

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

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

var gameState = {
  state: loaded,
  lastPlayer: null,
  lastScore: null
};

这并不意味着“我不知道最后一个玩家是谁”,而是意味着“没有最后一个玩家”。

于 2012-08-31T16:03:22.413 回答
2

==为了澄清先前的答案,以这种方式工作的原因是,与 不同===,它会进行类型转换

于 2012-08-31T15:36:15.710 回答
2
 var a;
 var b = null;

a 未定义,b 完全为空。

==用于以故意松散的方式比较相等,这通常很有用

alert("3" == 3.0);

这给了我们true尽管它们明显不同 - 一个是数字,一个是字符串。

不过很多时候,这很棒。

同样,很多时候并不关心某些东西是否没有真正的价值,因为它是未定义的,或者是因为它被显式设置为 null。

虽然有时很有用,但我们有时也需要知道确切的类型匹配以及值,所以我们也有===

于 2012-08-31T15:41:27.307 回答
2

我还要说undefined与 一起使用typeof。比较必须为:

if( typeof(b)=="undefined" ){}

给出相同的结果

if( b === undefined ){}

我已经在你的代码 http://jsfiddle.net/A89Qj/5/上包含了这个额外的测试

于 2012-08-31T20:21:17.603 回答
1

您需要使用 === 而不是 ==。=== 运算符的行为方式与 == 运算符相同,只是它不进行任何类型转换。

于 2012-08-31T15:36:23.690 回答
0

typeof undefined 是未定义的,但 null 的类型是对象。null === undefined 会给你错误的。但是 null == undefined 会给你真实的。因为 boh 具有不同的数据类型但具有相同的值。

于 2016-03-17T14:18:36.867 回答