1.扩展运算符
扩展运算符可以将数组内容展开,可以用于替代函数的apply方法。
function f(x, y, z) {
// ...
}
let args = [0, 1, 2];
f(...args);//参数数组展开
let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);//扩展运算符可以用于数组的push方法
另一方面,数组扩展运算符可以用于数组复制,从而避免了引用。
const a1 = [1, 2];
// 写法一
const a2 = [...a1];
// 写法二
const [...a2] = a1;
只要带有遍历器接口的对象,都可以使用扩展运算符转换为数组。
let nodeList = document.querySelectorAll('div');
let array = [...nodeList];//类数组对象,但具有遍历器接口
2.find()与findIndex()
find
方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true
的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined
。
[1, 4, -5, 10].find((n) => n < 0)
// -5
数组实例的findIndex
用法与find
方法类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1
。
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
}) // 2
这两个方法都可以接受第二个参数,用来绑定回调函数的this
对象。
function f(v){
return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person); // 26
3.entries(),keys(),values()
entries()
,keys()
和values()
三种方法均用于遍历数组。它们都返回一个遍历器对象,可以用for...of
循环进行遍历,唯一的区别是keys()
是对键名的遍历、values()
是对键值的遍历,entries()
是对键值对的遍历。
for (let index of ['a', 'b'].keys()) {
console.log(index);
}
// 0
// 1
for (let elem of ['a', 'b'].values()) {
console.log(elem);
}
// 'a'
// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem);
}
// 0 "a"
// 1 "b"
4.includes()
includes()方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes
方法类似。
该方法的第二个参数表示搜索的起始位置,默认为0
。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4
,但数组长度为3
),则会重置为从0
开始。
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
另外,Map 和 Set 数据结构有一个has
方法,需要注意与includes
区分。
has
方法,是用来查找键名的,比如Map.prototype.has(key)
、WeakMap.prototype.has(key)
、Reflect.has(target, propertyKey)
。has
方法,是用来查找值的,比如Set.prototype.has(value)
、WeakSet.prototype.has(value)
。