为啥这个 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 === y
与NaN
始终为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 === NaN
和 NaN == 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 中的空值创建默认对象