Array.from()
Array.from() 方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)对象
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
}
let arr = Array.from(arrayLike);
console.log(arr); // ["a", "b", "c"]
如果参数是一个真正的数组,Array.from()会返回一个一模一样的数组
let arr = Array.from([1, 2, 3]);
console.log(arr); //[1, 2, 3]
Array.from()可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组
let arr = Array.from([1, 2, 3], (x) => x * x);
console.log(arr);//[1, 4, 9]
Array.from()可以将各种值转为真正的数组,并且还提供map功能。这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法。
let arr = Array.from({ length: 2 }, () => '暂无数据');
console.log(arr);//["暂无数据", "暂无数据"]
如果map函数里用到了this关键字,还可以传入Array.from()的第三个参数,用来绑定this
Array.of()
Array.of()方法用于将一组值,转换为数组
let arr1 = Array.of(1, 2, 3);
let arr2 = Array.of('a', 'b', 'c');
console.log(arr1);//[1, 2, 3]
console.log(arr2);//["a", "b", "c"]
数组实例的copyWithin()
数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前的数组,也就是说使用这个方法修改当前数组。
可接受三个参数
- target(必须):从该位置开始替换数组,如果为负值,表示倒数。
- start(可选):从该位置开始读取数据,默认为0,如果为负值,表示倒数
- end(可选):到该位置前停止读取数据,默认等于数组长度,如果为负值,表示倒数
三个参数都应该是数值,如果不是,会自动转为数值
let arr = [1, 2, 3, 4, 5];
arr.copyWithin(0, 3);
//表示将从三号位知道数组结束的成员(4和5),赋值到从0号位开始的位置,所以覆盖掉了1和2
console.log(arr); //[4, 5, 3, 4, 5]
更多
//将三号位复制到0位
console.log(['a', 'b', 'c', 'd', 'e'].copyWithin(0, 3, 4)); //["d", "b", "c", "d", "e"]
// -2相当于3号位,-1相当于四号位
console.log([1, 2, 3, 4, 5].copyWithin(0, -2, -1)); //[4, 2, 3, 4, 5]
数组实例的find()和findIndex()
数组实例的find方法,用于找出第一个符合条件的数组成员,它的参数是一个回调函数,所有的数组成员一次执行该回调函数,直到找出第一个返回true的成员,然后返回该成员,如果没有符合条件的成员,返回undefined
//找出第一个小于0的成员
let negative = [1, 2, 4, -1, 7].find((x) => x < 0);
console.log(negative); //-1
举个
//可接受三个参数,依次为当前的值,当前的位置,原数组
let num = [1, 7, 10, 16].find(function(value, index, arr) {
return value > 10;
})
console.log(num); // 16
数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1
//可接受三个参数,依次为当前的值,当前的位置,原数组
let num = [1, 7, 10, 16].findIndex(function(value, index, arr) {
return value > 10;
})
console.log(num); // 3
function f(v) {
return v > this.age
}
let person = { name: "Mr", age: 22 };
console.log([10, 20, 25, 30].find(f, person)); // 25
这两个方法都可以发现NaN,弥补数组的indexOf方法的不足
console.log([NaN].indexOf(NaN)); // -1
//Object.is()是ES6新增的用来比较两个值是否严格相等的方法,与===的行为基本一致。
console.log([NaN].findIndex(y => Object.is(NaN, y))); // 0
数组实例的fill()
fill方法使用给定值,填充一个数组
console.log(['a', 'b', 'c'].fill(1)); //[1, 1, 1]
console.log(new Array(3).fill('a')); //["a", "a", "a"]
fill方法用于空数组的初始化非常方便。数组中已有元素会被全部抹去
fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置
console.log([1, 2, 3, 4].fill('a', 0, 2));//["a", "a", 3, 4]
注意:如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象
let arr = new Array(3).fill({ name: 'Mr Wang' });
arr[0].name = "Mr Li";
console.log(arr); //[{name: "Mr Li"},{name: "Mr Li"},{name: "Mr Li"}]
let arr2 = new Array(3).fill([]);
arr2[0].push('1');
console.log(arr2);// [["1"],["1"],["1"]]
数组实例的entries()、keys()和values()
ES6提供三个新的方法,都是用于遍历数组,他们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一区别是:keys()是对键名的遍历,values()是对键值的遍历,entries()是对键值对的遍历
for (const iterator of['a', 'b', 'c'].keys()) {
console.log(iterator);
// 0
// 1
// 2
}
for (const iterator of['a', 'b', 'c'].values()) {
console.log(iterator);
// a
// b
// c
}
for (const iterator of['a', 'b', 'c'].entries()) {
console.log(iterator);
// [0, "a"]
// [1, "b"]
// [2, "c"]
}
数组实例的includes()
这个方法返回一个布尔值,表示某个数组是否包含给定值
console.log([1, 2, 3].includes(1)); //true
console.log(['a', 'c', 'd'].includes('d')); //true
console.log([1, 2, 3, 4].includes(5)); //false
console.log(['a', 1, NaN].includes(NaN)); //true
该方法的第二个参数表示搜索的其实位置,默认为0。如果第二个参数为负数,则表示倒数位置,如果这个值大于数组长度,则会重置为0开始
数组实例的flat(),flatMap()
数组的成员有时还是数组,Array.prototype.flat()用于将嵌套的数组“拉平”。该方法返回一个新数组,对原数组没有任何影响
console.log([1, 2, ['a', 'c']].flat()); // [1, 2, "a", "c"]
flat()默认只会拉平一层,如果想要拉平多层嵌套数组,可以将flat的方法的参数写成一个整数,表示想要拉平的层数,默认为1
console.log([1, 2, [3, 4, [5]]].flat());//[1, 2, 3, 4, [5]]
console.log([1, 2, [3, 4, [5]]].flat(2));//[1, 2, 3, 4, 5]
如果不管有多少层嵌套,都要转成一堆数组,可以用Infinity关键字作为参数
console.log([1, [2, [3, [4, 5, ['a']]]]].flat(Infinity)); // [1, 2, 3, 4, 5, "a"]
- 需要注意的是,如果原数组中有空位,flat()方法会跳过空位
flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法,该方法返回一个新数组,不改变原数组。
console.log([1, 2, 3].flatMap((x) => [x, x * x]));//[1, 1, 2, 4, 3, 9]
-
flatMap()只能展开一层数组
console.log([1, 2, 3].flatMap((x) => [ [x, x * x] ])); //[[1, 1], [2, 4], [3, 9]]
flatMap()方法的参数是一个遍历函数,该函数可以接受三个参数,分别是当前数组成员,当前数组成员位置(从0开始),原数组。而flatMap()方法还可以有第二个参数,用来绑定遍历函数里面的this
数组的空位
数组的空位值就是数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位
console.log(Array(3)); // [, , ,]
注意。空位不是undefined,一个位置的值等于undefined,依然是有值的,空位是指没有任何值。
由于数组的众多方法对空位的处理规则非常不统一,所以建议避免出现空位