【问题标题】:Type casting when == used instead of === [duplicate]当使用 == 而不是 === 时进行类型转换 [重复]
【发布时间】:2014-04-14 09:09:11
【问题描述】:

我通常不喜欢使用 ==,但今天我只是在尝试以下代码,包括 ==,结果让我有点困惑。有人可以解释发生了什么吗?

所有这些都是假值:

'', 0, false, undefined, null

假设我这样做了:

if (undefined == null) {
    alert('a');
} else {
    alert('b');
}

以下陈述给出正确

null == undefined
0 == ''
false == ''
0 == false

但是为什么下面的代码返回false

undefined == 0
undefined == ''
null == 0

【问题讨论】:

标签: javascript casting comparison operators


【解决方案1】:

因为0false'' 是“价值”,而null 是“缺乏价值”而undefined 是“缺乏定义”。

因此,您可以将“值”相互比较,“非值”也是如此。但你不能将“价值”与“非价值”进行比较。

【讨论】:

  • == 运算符有一个特定的算法,它不像值或真实性或任何其他概括那么简单。
  • 好吧,虽然每个人(包括我自己)都知道该算法(参见所有比较表和 ECMAScript 规范。),但如果该算法没有回答这个问题:为什么。
  • 好的,我将问题解释为“我为什么要获得这些值”,而不是“为什么规范会这样”。不是每个人都知道这个算法。大多数 js 开发人员使用 == 直到类似这样的事情让他们感到困惑,然后他们来 SO 寻求答案。
【解决方案2】:

null 和 undefined 是虚无。即

var a;
var b = null;

这里 a 和 b 没有值。而:0false'' 都是值。所有这些的共同点是它们都是假值,这意味着它们都满足假条件。

所以,0false'' 一起构成了一个子组。

另一方面,null & undefined 构成第二个子组。检查下图中的比较。 null 和 undefined 将相等。其他三个将彼此相等。但是,它们在 JS 中都被视为虚假条件。

这与任何对象相同(如{}arrays 等),非空字符串和布尔值 true 都是真值条件。但是,它们并不相等。

【讨论】:

    【解决方案3】:

    == 运算符只是检查事物是否为假;它遵循称为抽象相等比较算法的过程,可以在这里看到:ECMAScript spec

    undefined == 0undefined == ''

    根据规范,undefined 仅与 undefinednull 比较 true。由于0'' 都不是这些值,因此它返回false。

    null == 0

    根据规范,null 仅将 true 与另一个 nullundefined 进行比较 - 这里不是这种情况。

    使用===

    通常最好使用=== 并进行您实际想要的比较,而不是信任== 算法,而且通常也更快。如您所见,当算法没有达到您的预期时,很容易被发现,而且通常比跟踪比较算法将采用哪条路径更简单。

    有关 javascript 中“相同性”的一般信息,请参阅this MDN page

    【讨论】:

      【解决方案4】:

      但是为什么下面给出的是假的呢?

      undefined == 0
      undefined == ''
      null == 0
      

      技术上的“为什么”是因为真值表说明了这一点。

      哲学上的“为什么”是因为 undefinednullnot a number 并且不是字符串。

      (parseInt(undefined) -> NaN)。

      所以NaN != 0

      但要小心:还有undefined != NaN,因为NaN != NaN。仅仅因为香蕉不是猕猴桃。但苹果也不是猕猴桃。而且 Banana 仍然不是苹果。

      所以avetisk的答案是正确的。你无法比较你知道它们是什么但你不知道它们是什么的对象。

      【讨论】:

      • 考虑修改您的香蕉/猕猴桃/苹果比较; NaN 将 false 与包括自身在内的所有内容进行比较,因为 IEEE754 规范是这样说的,并且 javascript 对所有数值使用 IEEE754 双精度值。
      • @PhilH 正是我所说的。香蕉和猕猴桃不是平等的,如果两者都不是苹果的话。我明确表示NaN!=NaN
      • 好吧,逻辑并不完整,因为 A != B && C != B 并不意味着 B != B,但 NaN != NaN 是我要指出的。即使是相同的 NaN ...如果 someVal 是 nan,即使 someVal == someVal 也会返回 false。相比之下,猕猴桃就是猕猴桃。
      • 没有。相比之下:一个“非猕猴桃”不等于另一个“非猕猴桃”:-)。但无论如何,这只是一个例子,例子从来都不是 1:1。
      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 2023-03-29
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2019-03-23
      • 2019-08-21
      相关资源
      最近更新 更多