为什么“未定义”==未定义是不正确的

Why "undefined" == undefined isn't true?

本文关键字:未定义 不正确 为什么      更新时间:2023-09-26

==运算符真的很有趣。它通常不会像人们想象的那样行事。

这促使我调查了冰山一角以下到底发生了什么,根据MDN的说法,情况如下:

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

(来源)

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

undefined不应该转换为"undefined"然后根据此描述返回 true?

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

使用您提供的解释,右侧的undefined值将转换为未分配值的String对象,然后与"未定义"String进行比较,从而无法进行比较。

对于这类问题,值得回到源头:ECMAScript 5.1 规范。第 11.9.3 节完整描述了双等式的情况:

  1. 如果 Type(x) 与 Type(y) 相同,则一些规则
  2. 如果 x 为空且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是 Number 且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是字符串,Type(y) 是 Number,则返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是布尔值,则返回比较结果 ToNumber(x) == y。
  7. 如果 Type(y) 是布尔值,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是字符串或数字,而 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 并且 Type(y) 是 String 或 Number,则返回比较 ToPrimitive(x) == y 的结果。
  10. 返回假。

因为在这种情况下Type(x)是string而Type(y)是undefined的,规则规定结果应该是假的。

undefined是JavaScript中内置值的原语,内置类型为Undefined。做一个比较,比如x == undefined,在javascript中有一个特殊的含义:它检查变量是否尚未定义。

"undefined"字面上是一个stringundefined是一个object。我认为它用nothing""an empty string铸造右侧操作数.所以"undefined" == null返回false.

undefined是一个

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

var a = undefined;
//if( a == undefined ) 
//if( a === undefined )