array.indexOf和array.includes
October 03, 2018
一点微小差别
indexOf 和 includes 都可以用来判断数组是否包含某个元素,二者到底有什么区别呢?看一个例子:
let a = [1,2,3,null,undefined,NaN];
if(a.indexOf(NaN)!==-1){
console.log('using Array.indexOf: Found NaN in Array a!');
}else{
console.log('using Array.indexOf: No NaN found in Array a~');
}
if(a.includes(NaN)){
console.log('using Array.includes: Found NaN in Array a!');
}else{
console.log('using Array.includes: No NaN found in Array a~');
}
//输出:
>'using Array.indexOf: No NaN found in Array a~'
>'using Array.includes: Found NaN in Array a!'
为什么
二者内部使用的算法不同:
- indexof 内部使用全等操作符,即
===
进行比较; - includes 内部使用的算法是
SameValueZero
;
全等操作符进行NaN===NaN
比较时,必然返回false
,所以indexOf
无法判断数组内是否含有 NaN。
而SameValueZero
的规则 2.1解释了原因:
x,y
类型不同,返回false
-
x,y
同为number
类型,那么- 同为
NaN
时,返回true
- 同为 0 时(不管 0 之前的符号),返回
true
- 数值相等时,返回
true
- 其他情况,返回
false
- 同为
x,y
同为其他类型,仅在值相同时返回true
结论
其实indexOf
和includes
二者的搜索机制差不多,只有比较算法不同。实际使用我倾向于后者,一方面因为前者这个隐含的坑,另一方面后者直接返回true/false
,更加直观。