为什么“undefined”== undefined不正确?

时间:2012-05-21 20:03:42

标签: javascript undefined equality

==运营商真的很有趣。人们认为它会usually doesn't behave

这导致我准确调查冰山一角下发生了什么,根据MDN,它如下:

  

如果两个操作数的类型不同,则JavaScript会转换   操作数然后应用严格的比较。如果任一操作数是一个数字   或者布尔值,如果可能,操作数将转换为数字;其他   如果任一操作数是一个字符串,则另一个操作数转换为a   如果可能的话。如果两个操作数都是对象,那么JavaScript   比较操作数引用时相等的内部引用   内存中的同一个对象。

<子> (source)

那么,为什么"undefined" == undefined没有评估为真?

不应该undefined转换为"undefined",然后根据此说明返回true?

5 个答案:

答案 0 :(得分:20)

"undefined"有一个值。它是9个字母:u-n-d-e-f-i-n-e-d。因此,字符串“undefined” not 具有未定义的值。 javascript 中的String可以具有未定义的值,但此处String对象具有定义的值恰好拼写为“未定义”。

使用您提供的解释,右侧的undefined值将转换为没有赋值的String对象,然后与String“undefined进行比较“,没有比较。

答案 1 :(得分:2)

对于这些类型的问题,值得回到源头:ECMAScript 5.1 specification。第11.9.3节详细描述了双等于:

  1. 如果Type(x)与Type(y)相同,那么 //一些规则
  2. 如果x为null且y未定义,则返回true。
  3. 如果x未定义且y为null,则返回true。
  4. 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。
  5. 如果Type(x)为String且Type(y)为Number,则返回比较结果ToNumber(x)== y。
  6. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  7. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
  8. 如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
  9. 如果Type(x)是Object而Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。
  10. 返回false。
  11. 由于在这种情况下Type(x)为string而Type(y)为undefined,因此规则声明结果应为false。

答案 2 :(得分:0)

undefined是内置类型Undefined的javascript内置的原始值。进行x == undefined之类的比较,在javascript中具有特殊含义:它检查变量是否尚未定义。

答案 3 :(得分:0)

"undefined"字面意思是stringundefinedobject。我认为它会使用nothing""an empty string投射右侧操作数。因此"undefined" == null返回false

答案 4 :(得分:-2)

undefined是一个特殊的javascript关键字,以下是检查未定义变量/属性的方法。

var a = undefined;

//if( a == undefined ) 

//if( a === undefined )