检查JS数组是否包含特定值
原文:Check if a JS Array Contains a Specific Value
检查JavaScript数组是否包含某个值,有两种常见方法:includes()
和indexOf()
。本文展示了如何使用二者,以及二者分别适用的场景。
一个JavaScript数组,有两种内置的数组方法可以确定数组是否包含指定元素。例如有3个元素的简单数组:
1 | const arr = ['A', 'B', 'C']; |
要确定arr
是否包含字符串'B'
,可以使用Array#includes()
或Array#indexOf()
。
includes()
Array#includes()
从ESMAScript 2016开始引入。它接收一个参数valueToFind
,如果数组中存在等于valueToFind
的元素则返回true
。
1 | const arr = ['A', 'B', 'C']; |
Array#includes()
函数检查是否相等,与===
运算符(不进行类型强制转换)有基本相同的语义。有一个例外是NaN
,Array#includes()
函数会在数组中找到NaN
(译注:NaN !== NaN)。这种相等检查的学名叫做sameValueZero
。
1 | // 数组包含1个元素, 'NaN' |
indexOf()
Array#indexOf()
函数也很常见,可以替代includes()
。indexOf()
函数返回数组找到的第一个valueToFind
的index,找不到返回-1
。
1 | const arr = ['A', 'B', 'C']; |
要检查arr
是否包含v
,使用arr.indexOf(v) !== -1
。在一些代码中,可能会看到~arr.indexOf(v)
,~
代表位操作符非。
一个整数v,~v === -(v + 1)
,如果v === -1
那么~v === 0
。这是一种方便的小技巧,可以不用写!== -1
。但是使用位操作一般而言是不好的习惯,只是少输入了4个字符,但牺牲了可读性。
1 | const arr = ['A', 'B', 'C']; |
与Array#includes()
不同,Array#indexOf()
检查相等时,与===
运算符有完全相同的语义。也就是说,Array#indexOf()
无法在数组中查找NaN。
1 | // 数组包含1个元素, NaN |
Array#includes()
通常是更好的选择,因为不需要输入!== -1
,而且在判断相等时有略微的优势。但Array#includes()
时从ES2016才引入,所有的IE、6.0.0之前版本的Node.js是不支持的。如果使用Array#includes()
,要确保为老版本浏览器添加polyfill。