为啥这个 JavaScript includes() 功能有意义?

Posted

技术标签:

【中文标题】为啥这个 JavaScript includes() 功能有意义?【英文标题】:Why this JavaScript includes() feature make sense?为什么这个 JavaScript includes() 功能有意义? 【发布时间】:2018-04-01 00:15:27 【问题描述】:

我正在学习 includes() 功能,我找到了这段代码

[NaN].includes(NaN) //True

但是

NaN === NaN // False

为什么会这样?

【问题讨论】:

为什么不可能呢?您可以轻松定义自己的值比较逻辑:function isSame(a, b) return isNaN(a) ? isNaN(b) : a === b;。如果能做到,语言也能做到。 【参考方案1】:

使用相等 NaN === NaN 和使用包含 [NaN].includes(NaN) 基本上是在问两个不同的问题:

    平等 - 这些同名的东西实际上是平等的吗?

NaN 是一个无定形实体,它描述了不是数值的概念,实际上并没有可以比较的值。等式使用Strict Equality Comparison,并定义在等式的任何一侧比较x === yNaN 始终为false

一个。如果 x 为 NaN,则返回 false。 湾。如果 y 为 NaN,则返回 false。

    包括 - 数组中是否有带有该“名称”的内容?

但是,要在数组中搜索 NaN,并保持 to Array#includes 仅传递一个参数而不是回调的签名,我们需要一种方法来“命名”我们正在搜索的内容。为此,请根据ECMAScript 2016 (ECMA-262) docs 中的 Array#includes 定义:

includes 方法故意与类似的 indexOf 不同 方法有两种。首先,它使用 SameValueZero 算法, 而不是严格相等比较,允许它检测 NaN 数组元素。其次,它不会跳过丢失的数组元素, 而是将它们视为未定义。

SameValueZero(x, y) 的定义指出,比较时:

如果 x 是 NaN 而 y 是 NaN,则返回 true。

【讨论】:

【参考方案2】:

[ NaN ].includes(NaN) 的作用是检查NaN 是否在[ ] 中。

NaN === NaNNaN == NaN 仍将返回相同的值,即 false。你只需要知道includes 方法检查一个值是否是它被调用的数组。在幕后我认为includes Array 方法使用typeof() 进行检查

typeof(NaN) // number
[ NaN ].includes(NaN) // true

typeof("1") // string
[ 1 ].includes("1") // false

typeof(1) // number
[ 1 ].includes(1) // true

这是根据includes 方法使用的SameValueZero 算法。它在内部检查值的类型

【讨论】:

【参考方案3】:

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/isNaN

与 JavaScript 中的所有其他可能值不同,不可能依靠相等运算符(== 和 ===)来确定值是否为 NaN,因为 NaN == NaN 和 NaN === NaN 评估为假。因此,isNaN 函数的必要性。

【讨论】:

以上是关于为啥这个 JavaScript includes() 功能有意义?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将两个数组与“包含”进行比较? [复制]

为啥 Ruby on Rails 不使用 .includes() 加载我的关联对象?

JavaScript .includes() 方法的多个条件

JavaScript String includes() 方法

Vue、Vuex、JavaScript:includes() 无法按预期工作

为啥我不能在 Wordpress 中创建新帖子?警告:从第 716 行 /public_html/wp-admin/includes/post.php 中的空值创建默认对象