5

==接线员真的很有趣。它通常不会像人们想象的那样行事。

这使我确切地调查了冰山一角下面发生的事情,根据MDN的说法如下:

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

(资源)

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

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

4

5 回答 5

20

"undefined"有一个价值。它是 9 个字母:未定义。因此,字符串“undefined”没有未定义的值。Stringjavascript中的A可以有一个未定义的值,但这里的String对象有一个定义的值,恰好拼写为“未定义”。

使用您提供的解释,undefined右侧的值将转换为String未分配值的对象,然后与String“未定义”进行比较,比较失败。

于 2012-05-21T20:06:16.920 回答
2

对于这类问题,值得回到源头:ECMAScript 5.1 规范。第 11.9.3 节完整描述了双等号会发生什么:

  1. 如果 Type(x) 与 Type(y) 相同,那么 // 一些规则
  2. 如果 x 为 null 且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是 String 并且 Type(y) 是 Number,则返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是 Boolean,则返回比较 ToNumber(x) == y 的结果。
  7. 如果 Type(y) 是 Boolean,则返回比较结果 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. 返回假。

由于在这种情况下 Type(x) isstring和 Type(y) is undefined,规则规定结果应该为假。

于 2012-05-21T20:29:31.013 回答
0

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

于 2012-05-21T20:10:13.533 回答
0

"undefined"从字面上看是 astring并且undefinedobject. nothing我认为它使用or ""or投射右侧操作数an empty string。所以"undefined" == null返回false

于 2012-05-21T20:18:36.963 回答
-2

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

var a = undefined;

//if( a == undefined ) 

//if( a === undefined )
于 2012-05-21T20:08:42.020 回答