当前位置: 首页 > 知识库问答 >
问题:

为什么[NaN].includes(NaN)在JavaScript中返回true?

萧宏远
2023-03-14

我很熟悉nan在JavaScript中是“怪异的”,即nan===nan总是返回false,如本文所述。因此,不应进行===比较来检查nan,而应使用isNaN(..)取而代之的是。

所以我惊讶地发现

> [NaN].includes(NaN)
true

这似乎不一致。为什么会有这种行为?

它是怎么工作的?includes方法是否专门检查isnan

共有2个答案

曹渝
2023-03-14

.includes()方法使用samevaluezero算法检查两个值的相等性,并认为nan值等于自身。

samevaluezero算法与samevalue相似,但唯一的区别是samevaluezero算法认为+0-0是相等的。

object.is()方法使用samevalue,它为nan返回true。

null

console.log(Object.is(NaN, NaN));
隗锐进
2023-03-14

根据MDN的文件说

注意:从技术上讲,include()使用samevaluezero算法来确定是否找到给定元素。

null

let arr = [2, NaN];
console.log(arr.indexOf(NaN));                      // -1 (false)
console.log(arr.includes(NaN));                     // true
console.log(arr.findIndex(n => Number.isNaN(n)));   // 1
 类似资料:
  • 问题内容: 只是出于好奇。 数字似乎不太合逻辑。顺便说一句,就像或返回假。这是javascript的特性之一,还是有原因呢? 编辑:谢谢你的回答。但是,要让所有人适应现实并非易事。阅读答案和Wiki我了解得更多,但仍然有类似 与NaN的比较始终会返回无序结果,即使与自身进行比较也是如此。比较谓词是信令或非信令,信令版本表示此类比较的无效异常。相等和不相等谓词是无信号的,因此x = x返回false

  • 问题内容: 为什么返回 Javascript? 在文档页面上,我看到以下内容: ## 针对NaN的测试 相等运算符(和)不能用于测试的值。使用代替。 有没有参考资料可以回答这个问题?不客气。 问题答案: 严格的回答 :因为JS规范是这样说的: 如果Type(x)是Number,则 如果x为NaN,则返回false。 如果y为NaN,则返回false。 有用的答案 :浮点数的IEEE 754规范(所

  • 我不明白为什么下面的函数返回NaN,甚至答案不应该是NaN。我试着搜索类似的问题,但大多数是在其他编程语言中,我无法理解。 提前谢了。

  • 问题内容: 这个问题是由我前段时间给出的答案引起的。 假设我有一个这样的数据框 我想,以取代由最大行的,我可以做 这给了我想要的输出 但是,当我使用 由于某种原因,仅在以下三种情况中的两种情况下才可以正确更换它: 确实,如果我亲自检查 然后打印 做的时候 它打印预期的 我的问题是,为什么在三种情况中有一种失败了,但在全部3种情况中都没有失败? 问题答案: 原因是通过将第一个值作为“到目前为止看到的

  • 我在一个JavaScript类中有一个乘法方法,它应该将数组中非未定义的所有元素相乘。我使用for loop检查每个元素的类型,即number并将它们推到一个空数组,然后使用reduce方法将它们相乘。但我现在有的问题是结果是返回南。我想知道我做错了什么。 下面是我的代码。 null null

  • 众所周知,NaN在算术中传播,但我找不到任何演示,所以我写了一个小测试: 这个例子(在这里实时运行)基本上产生了我所期望的(消极有点奇怪,但它有点道理): 2015年MSVC奥运会产生了类似的东西。然而,英特尔C 15生产: 具体来说,。 这...不可能是对的,对吧?相关标准(ISO C,ISO C,IEEE 754)对此有什么说法,为什么编译器之间的行为会有差异?