本文完整阅读约需 7 分钟,如时间较长请考虑收藏后慢慢阅读~

JavaScript由于一些历史遗留原因,其API实在太乱,导致了在其他语言中形成的直觉,很难在JavaScript中找到对应的方法。判断一个值是否在一个数组中,这一简单的需求,背后其实有一个非常大的坑。

如果翻阅MDN的JavaScript-保留字列表,会发现有一个in关键字,通常我们就会想当然的以为:『那么a in array』一定可以拿来判断a是否在array中吧。

这就是非常大的一个误解。

当然,我个人觉得这个误解错不在程序员,想当然也是很正常的习惯,JavaScript在语法方面实在是糟糕透顶。

in这个关键字其实是用于判断前者是否在后者的Key列表中,而非判断是否在Value列表中。

举例:

>>> var array = ["test", "test2", "test3"];
>>> var test = "test";
>>> test in array;
false
>>> 0 in array; // 此处的0指的是索引,也就是Value
true

而这个关键字最大的用途其实是在Object上,如官方文档所示:

var car = {make: 'Honda', model: 'Accord', year: 1998};

console.log('make' in car);
// expected output: true

delete car.make;
if ('make' in car === false) {
  car.make = 'Suzuki';
}

console.log(car.make);
// expected output: "Suzuki"

回到话题,如果我们想判断一个值是否在一个数组中应该怎么做呢?

我们需要请出Array.prototype.includes()这个函数!
举例(参考官方文档):

var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

也就是说,in这个关键字并不是JavaScript官方提供的语法糖,它的应用范围在某种程度上仅限于Object(当然,如果想用在Array也不是不行),而对于Array,真正能够满足我们需求的,也是最常用的,还是Array.prototype.includes()

注意:Array.prototype.includes()是ES2016规范的产物,兼容性不是很理想,如果想要最理想的兼容性,请使用Array.prototype.indexOf(),使用方法如下:

var array = [2, 5, 9];
array.indexOf(2) !== -1;

后记:
JavaScript实在太乱,也太复杂,尽管我已经写了一年半的前端,仍旧无脸自诩『前端程序员』。
需要学习的东西还很多,类似这样的『坑』还不少。
企图一口气全部把这些坑绕过是不可能的,只能靠多写,多学,多练,多总结。
路漫漫其修远兮。