如何使用JavaScript判断一个值是否在一个数组中
本文完整阅读约需 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实在太乱,也太复杂,尽管我已经写了一年半的前端,仍旧无脸自诩『前端程序员』。
需要学习的东西还很多,类似这样的『坑』还不少。
企图一口气全部把这些坑绕过是不可能的,只能靠多写,多学,多练,多总结。
路漫漫其修远兮。
1 条评论