gpt4 book ai didi

javascript - (NaN != NaN) 和 (NaN !== NaN) 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 13:18:38 26 4
gpt4 key购买 nike

首先我想说的是,我知道isNaN()Number.isNaN()工作。我正在阅读 David Flanagan 的 The Definite Guide,他举例说明了如何检查值是否为 NaN :

x !== x

这将导致 true当且仅当 xNaN .

但现在我有一个问题:他为什么要使用严格比较?因为好像

x != x

行为方式相同。使用这两个版本是否安全,或者我在 JavaScript 中缺少一些将返回 true 的值对于 x !== xfalse对于 x != x ?

最佳答案

首先,让我指出 NaN 是一个非常特殊的值:根据定义,它不等于自身。这来自 JavaScript 数字所依据的 IEEE-754 标准。 “非数字”值永远不会等于自身,即使位完全匹配。 (它们不一定在 IEEE-754 中,它允许多个不同的“非数字”值。)这就是为什么会出现这种情况; JavaScript 中的所有其他值都等于它们自己,NaN 只是特殊的。

...am I missing some value in JavaScript that will return true for x !== x and false for x != x?

不,你不是。 !==!= 之间的唯一区别是后者将在必要时进行类型强制以使操作数的类型相同。在 x != x 中,操作数的类型是相同的,所以和 x !== x 完全一样。

这从 Abstract Equality Operation 的定义开始就很清楚了。 :

  1. ReturnIfAbrupt(x).
  2. ReturnIfAbrupt(y).
  3. If Type(x) is the same as Type(y), then

    Return the result of performing Strict Equality Comparison x === y.

  4. ...

前两个步骤是基本的管道。所以实际上,== 的第一步是查看类型是否相同,如果是,则改为执行 ===!=!== 只是它的否定版本。

因此,如果 Flanagan 是正确的,只有 NaNx !== x 为真,我们可以确定只有 NaN 将为 x != x 提供真值。

许多 JavaScript 程序员默认使用 ===!== 来避免松散运算符所做的类型强制的一些陷阱,但没有什么可以读入 Flanagan 的在这种情况下使用严格与松散的运算符。

关于javascript - (NaN != NaN) 和 (NaN !== NaN) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34261938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com