ES6数组扩展
Posted mijiujs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6数组扩展相关的知识,希望对你有一定的参考价值。
扩展运算符
console.log(...[1, 2, 3]) // 1 2 3
运用
1.替代函数的apply方法
function f(x,y,z){} let args=[1,2,3] f.apply(null,args) f(...args)
Math.max(...args)
arr.push(...arr2)
2.复制数组
const arr2=[...arr1] //方法1 const [...arr2]=arr1
3.合并数组
arr1.concat(arr2,arr3) [...arr1,...arr2,...arr3]
4.与解构赋值
const [first, ...rest] = []; first // undefined rest // [] const [first, ...rest] = ["foo"]; first // "foo" rest // []
5.将有Iterator接口的对象转换为数组
如字符串
[...‘hello‘] // [ "h", "e", "l", "l", "o" ]
如map,set(去重)
let map = new Map([ [1, ‘one‘], [2, ‘two‘], [3, ‘three‘], ]); let arr = [...map.keys()]; // [1, 2, 3]
Array.from()
将类数组对象和可比案例对象转换为数组
let arrayLike = { ‘0‘: ‘a‘, ‘1‘: ‘b‘, ‘2‘: ‘c‘, length: 3 }; // ES5的写法 var arr1 = [].slice.call(arrayLike); // [‘a‘, ‘b‘, ‘c‘] // ES6的写法 let arr2 = Array.from(arrayLike); // [‘a‘, ‘b‘, ‘c‘]
扩展运算符(...
)也可以将某些数据结构转为数组。
Array.from
还可以接受第二个参数,作用类似于数组的map
方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
Array.from(arrayLike, x => x * x); // 等同于 Array.from(arrayLike).map(x => x * x);
Array.of()
用于将一组值,转换为数组,主要目的是弥补构造函数Array()的不足
Array.of() // [] Array.of(undefined) // [undefined] Array.of(3, 11, 8) // [3,11,8] Array.of(3) // [3] Array.of(3).length // 1 Array() // [] Array(3) // [, , ,] Array(3, 11, 8) // [3, 11, 8]
Array.of
方法可以用下面的代码模拟实现。
function ArrayOf(){ return [].slice.call(arguments); }
实例方法copyWithin()
数组实例的copyWithin()
方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。
Array.prototype.copyWithin(target, start = 0, end = this.length)
- target(必需):从该位置开始替换数据。如果为负值,表示倒数。
- start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
- end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
[1, 2, 3, 4, 5].copyWithin(0, 3) // [4, 5, 3, 4, 5]
实例方法 find() 和 findIndex()
找到第一个符合条件的成员
find()成功返回该成员,否则返回undefined
findIndex成功放回该成员位置,否则返回-1
实例方法fill()
使用给定值,填充一个数组。第一个参数为填充值,第二个参数和第二个参数用于指定填充的起始位置和结束位置(结束为止不包括
[‘a‘, ‘b‘, ‘c‘].fill(7) // [7, 7, 7] [‘a‘, ‘b‘, ‘c‘].fill(7, 1, 2) // [‘a‘, 7, ‘c‘] //2号位之前结束
注意,如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。
let arr = new Array(3).fill({name: "Mike"}); arr[0].name = "Ben"; arr // [{name: "Ben"}, {name: "Ben"}, {name: "Ben"}] let arr = new Array(3).fill([]); arr[0].push(5); arr // [[5], [5], [5]]
实例方法entries(),keys() 和 values()
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"
实例方法includes()
第一个参数为要查找的值,第二个为其实位置
成功返回true,否则返回false
实例方法flat(),flatMap()
拉平数组,返回新数组
[1, 2, [3, [4, 5]]].flat() // [1, 2, 3, [4, 5]] 无参数默认参数为1 [1, 2, [3, [4, 5]]].flat(2) // [1, 2, 3, 4, 5] [1, [2, [3]]].flat(Infinity) // [1, 2, 3] 不管多少层嵌套拉平用Infinity [1, 2, , 4, 5].flat() // [1, 2, 4, 5] 跳过空位
flatMap()
方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()
),然后对返回值组成的数组执行flat()
方法。该方法返回一个新数组,不改变原数组。flatMap()
只能展开一层数组
// 相当于 [[[2]], [[4]], [[6]], [[8]]].flat() [1, 2, 3, 4].flatMap(x => [[x * 2]]) // [[2], [4], [6], [8]]
数组的空位
指数组的某一个位置没有任何值
Array(3) // [, , ,]
注意,空位不是undefined
,一个位置的值等于undefined代表
依然有值。空位是没有任何值。
forEach()
,filter()
,reduce()
,every()
和some()
都会跳过空位。map()
会跳过空位,但会保留这个值join()
和toString()
会将空位视为undefined
,而undefined
和null
会被处理成空字符串
ES6 则是明确将空位转为undefined
。
Array.from()将空位转为undefined
扩展运算法将空位转为undefined
copyWithin()
会连空位一起拷贝。
fill()
会将空位视为正常的数组位置。
for...of
循环也会遍历空位。
entries()
、keys()
、values()
、find()
和findIndex()
会将空位处理成undefined
。
Array.prototype.sort() 的排序稳定性
排序稳定性(stable sorting)是排序算法的重要属性,指的是排序关键字相同的项目,排序前后的顺序不变。
以上是关于ES6数组扩展的主要内容,如果未能解决你的问题,请参考以下文章