【问题标题】:Why does "undefined equals false" return false?为什么“未定义等于假”返回假?
【发布时间】:2013-10-17 03:10:44
【问题描述】:

当我将 undefined 和 null 与布尔值 false 进行比较时,语句返回 false:

undefined == false;
null == false;

它返回假。为什么?

【问题讨论】:

  • 你为什么认为它是真的?
  • @SLaks 因为0 == false 为真,等等
  • @abdulraziq: "i mean undefined is also false" - 不,不是。这是undefined
  • 顺便说一句,你应该使用严格相等。
  • 为了说明falseundefined之间的区别...我有3个苹果。我给简 3 个苹果。我还有苹果吗? (false) 我还有橘子吗? (未定义)

标签: javascript


【解决方案1】:

原始答案指向被删除的规范,我想在此处提供规范的链接和简短摘录。

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

ECMA 规范文档列出了 undefined == false 返回 false 的原因。虽然没有直接说明为什么会这样,但回答这个问题最重要的部分在于这句话:

比较 x == y,其中 x 和 y 是值,产生真或假。

如果我们查找 null 的定义,我们会发现如下内容:

NULL 或 nil 表示“无价值”或“不适用”。

在 Javascript 中,undefined 的处理方式相同。它没有任何价值。但是,false 确实有一个值。它告诉我们事情并非如此。而undefinednull 不应该给我们任何价值。同样,它的抽象相等比较也没有任何东西可以转换,因此结果总是错误的。这也是null == undefined 返回 true 的原因(它们都没有任何值)。应该注意的是,null === undefined 返回 false 因为它们的类型不同。 (在控制台中使用typeof(null)typeof(undefined) 进行检查)

但我很好奇的是,将NaN 与任何东西进行比较会总是返回 false。即使将其与自身进行比较。 [NaN == NaN 返回 false]

另外,还有一条奇怪的信息:[typeof NaN return "number"]


严格等式

如果可能,您应该避免使用 == 运算符来比较两个值。而是使用 === 来真正查看两个值是否彼此相等。 == 给人一种错觉,即两个值实际上完全相等,而它们可能不通过使用强制转换。例子:

5 == "5" 是真的

5 === "5" 为假

"" == false 是真的

"" === false 为假

0 == false 是真的

0 === false 为假

【讨论】:

    【解决方案2】:

    所以未定义实际上意味着未定义。不是 False,不是 True,不是 0,不是空字符串。所以当你比较 undefined 和 anything 时,结果总是假的,它是 not 等于的。

    【讨论】:

    • undefined == null 是真的。
    • 哇,@SLaks。看起来如此,我很惊讶,也有点失望。阅读并显示这是因为“==”运算符可以在两者之间进行强制转换。同意 Xander 的观点,“===”不这样做,对我来说更“直观”。很高兴你长大,今天我自己也学到了一些东西!
    • @asantaballa null == undefined 因为它被定义为这样:ecma-international.org/ecma-262/5.1/#sec-11.9.3
    • 尽可能在 JavaScript 中使用 ===。 == 给人一种错觉,即两个值实际上可能不完全相等。 (5 == "5" 为真。5 === "5" 为假。)
    【解决方案3】:

    From the incomparable MDN, sponsored by the company of JavaScript's creator.

    JavaScript 提供了三种不同的值比较操作:

    • 使用 === 的严格相等(或“三等号”或“身份”),
    • 使用 == 的松散相等(“双等号”),
    • 和 Object.is(ECMAScript > 6 中的新功能)。

    选择使用哪种操作取决于哪种类型 您希望执行的比较。

    简单地说,双等号在比较时会进行类型转换 两件事情;三等号 将在没有类型转换的情况下进行相同的比较(只需总是 如果类型不同,则返回 false);和 Object.is 将表现 与三等号相同,但对 NaN 和 -0 进行特殊处理 和 +0 以便最后两个不一样,而 Object.is(NaN, NaN) 将是真的。 (比较 NaN 和 NaN 通常——即使用双等号或三等号——计算 为假,因为 IEEE 754 是这样说的。)请注意区别 这些都与它们对原语的处理有关;没有 其中比较参数在概念上是否相似 结构体。对于任何具有相同的非原始对象 x 和 y 结构,但本身是不同的对象,以上所有形式 将评估为 false。

    对于 JavaScript 中相等的全貌的可视化概览: https://dorey.github.io/JavaScript-Equality-Table/

    事实是,当您了解 JavaScript 的工作原理时,JavaScript 的这个看似“糟糕”的方面是一种强大的力量。

    【讨论】:

    • 不,MDN 不是由公司创建的。这些文章是由任意志愿者撰写的,它是一个 wiki :-)
    • @Bergi 我很清楚谁为 MDN 做出了贡献。 MDN 本身是由 Mozilla 创建的。如果你要学究气,那就做对吧。
    【解决方案4】:

    根据上面提到的规范:

    如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。

    Number(undefined) = NaN;
    
    false == NaN // false
    

    而且如果我们改变订单false == undefined

    如果 Type(x) 为 Boolean,则返回比较结果 ToNumber(x) == 是的。

    Number(false) = 0;
    0 == undefined
    

    这种情况没有规则,所以使用默认行为:

    返回 false。

    【讨论】:

    • ToNumber 永远不会在 undefined 上调用。不知道你从哪里得到的。
    • 它来自规范,所以我只是从这里得到它。如果您有什么具体要说的,请继续。
    • 我说您误读或误解了规范。顺便说一句,链接您引用的文档会很好。
    【解决方案5】:

    您的问题是一半,因为我们将 undefined/null 与任何其他类型进行比较。 我们会有错误的回报。 即使我们使用 == 运算符,也不会发生强制。

    【讨论】:

      【解决方案6】:

      之所以如此,是因为如此。 :)

      在此处阅读 ECMA 标准:https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

      【讨论】:

      • 如果你要链接到一个标准,链接到官方:ecma-international.org/ecma-262/5.1/#sec-11.9.3
      • 在投反对票之前发现你有什么不同吗?
      • 除了您的链接早了两年(您的链接是从 2009 年开始,我的是从 2011 年开始)之外,您的链接和回复添加了我的链接/说明(在此之前 14 分钟发布) ) 省略?
      • 哦,真的吗?为什么?这是错的吗?是不是不太简洁?你的回答也对,我赞成并希望你被接受
      • 我过去曾经历过挫折,谷歌搜索的第一个结果是 SO 答案是过期链接的仅链接答案或“阅读规范”答案。有史以来最糟糕的经历。我不知道谁在运行 ecma262-5.com(看起来像是一个只为托管付费的人),但我知道 ecma-international.org 实际上是由一个有资金的组织运营的
      【解决方案7】:

      Undefined 和 false 不是一回事,false 是一个布尔对象(它的值为 0,因此它确实被定义了)。

      一个例子:

      var my_var;
      var defined = (my_var === undefined)
      alert(defined);  //prints true.  It is true that my_var is undefined
      
      my_var = 22;
      defined = (my_var === undefined)
      alert(defined);  //prints false.  my_var is now defined
      
      defined = (false === undefined)
      alert(defined);  //prints false, false is defined
      
      defined = (true === undefined)
      alert(defined);  //prints false, true is defined
      

      【讨论】:

      • @WesleyMurch 也 == !== ===。
      • 但是!undefined == true 是真的 :)
      • @vp_arth 我最喜欢的是undefined == nullundefined !== null(这两个都是真的)
      猜你喜欢
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2012-08-27
      • 1970-01-01
      • 2021-11-19
      • 2017-08-17
      相关资源
      最近更新 更多