Array#includes(..)
JS开发者需要执行的极其常见的一个任务就是在一个值的数组中搜索一个值。完成这项任务的方式曾经总是:
var vals = [ "foo", "bar", 42, "baz" ];
if (vals.indexOf( 42 ) >= 0) {
// 找到了!
}
进行>= 0
检查是因为indexOf(..)
在找到结果时返回一个0
或更大的数字值,或者在没找到结果时返回-1
。换句话说,我们在一个布尔值的上下文环境中使用了一个返回索引的函数。而由于-1
是truthy而非falsy,所以我们不得不手动进行检查。
在本系列的 类型与文法 中,我探索了另一种我稍稍偏好的模式:
var vals = [ "foo", "bar", 42, "baz" ];
if (~vals.indexOf( 42 )) {
// 找到了!
}
这里的~
操作符使indexOf(..)
的返回值与一个值的范围相一致,这个范围可以恰当地强制转换为布尔型。也就是,-1
产生0
(falsy),而其余的东西产生非零值(truthy),而这正是我们判定是否找到值的依据。
虽然我觉得这是一种改进,但有另一些人强烈反对。然而,没有人会质疑indexOf(..)
的检索逻辑是完美的。例如,在数组中查找NaN
值会失败。
于是一个提案浮出了水面并得到了大量的支持 —— 增加一个真正的返回布尔值的数组检索方法,称为includes(..)
:
var vals = [ "foo", "bar", 42, "baz" ];
if (vals.includes( 42 )) {
// 找到了!
}
注意: Array#includes(..)
使用了将会找到NaN
值的匹配逻辑,但将不会区分-0
与0
(参见本系列的 类型与文法)。如果你在自己的程序中不关心-0
值,那么它很可能正是你希望的。如果你 确实 关心-0
,那么你就需要实现你自己的检索逻辑,很可能是使用Object.is(..)
工具(见六章)。