这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
问题
面试官: 你能讲讲扩展运算符吗?
面试者: 巴拉巴拉。。。它主要是把数组结构转成序列,通常用于合并数组,拷贝数组(浅拷贝)等。
面试官:那你能讲讲Array.of的用法?
面试者: 它主要把类数组转成数组
面试官:这个好像是Array.from的用法哦?
面试者: 再给我一次机会。。。
以上纯属虚构,不知道会不会雷同。
下面总结es6数组新增的常用用法,包括扩展运算符,Array.of, Array.from等。
数组
扩展运算符
扩展运算符用...表示,后面跟着需要转换的数据,需要是具有Iterator接口。
以下数据具有Iterator接口
- 数组
- Map
- Set
- 字符串
- 类数组,比如
NodeList,arguments
扩展运算符是把具有Iterator接口的数据转成序列。 这个序列也可以转成数组。
var arr = [1,2,3]
console.log(...arr) // 1 2 3
console.log([...arr]) // 转回数组[1,2,3]
可以合并数组
var arr1 = [1,2,3]
var arr2 = [4,5,6]
// 之前的写法
arr1.concat(arr2) // [1, 2, 3, 4, 5, 6]
// 扩展运算符
[...arr1,...arr2]// [1, 2, 3, 4, 5, 6]
可以代替apply方法
var arr = [1,2,3]
// 之前的写法
Math.max.apply(null, arr) // 3
// 扩展运算符
Math.max(...arr) // 3
还可以解构, 注意扩展运算符只能用在最后
let [a, ...arr] = [1,2,3]
console.log(a, arr) // 1 [2,3]
let [a, ...arr, c] = [1,2,3]
console.log(a, arr, c) // error: Rest element must be last element
Array.of
Array.of 用于将传入的参数转成数组,并返回它。
Array.of(1,2,3) // [1,2,3]
Array.of(1) //[1]
Array.of('') //['']
因为new Array()或者Array()的参数,传一个的时候,当作是数组的长度,传多个的时候,当作数组的item。
new Array(3) // [empty × 3]
new Array(3,2) // [3,2]
Array.of可以解决这个差异。
Array.from
Array.from是将输入的参数转成数组。参数也需要是具有Iterator接口,但是除此之外,具有length属性的对象,也是可以的。
一般用的比较多是把类数组,比如NodeList,转成数组。
const div = document.querySelectorAll('div') //
console.log(div.map) // undefined
console.log(Array.from(div).map) // ƒ map() { [native code] }
const arr = Array.from({length:2})
console.log(arr) // [undefined, undefined]
console.log(Array.from('123')) // ['1','2','3']
console.log(Array.from([1,2,3])) // [1,2,3]
Array.from还可以接受第二个参数传入函数,对转成的数组的每项执行该函数并返回。
console.log(Array.from([1,2,3], (item) => item * 2)) // [2,4,6]
console.log(Array.from({length:2}, (item) => 'a')) // ['a', 'a']
flat(level)
扁平化数组,level代表的是扁平化几层。默认是1。
[1, [2], [3, 4]].flat() // [1,2,3,4]
[1, [2], [[3], 4]].flat() // [1,2,[3],4]
[1, [2], [[3], 4]].flat(2) // [1,2,3,4]
支持传入Infinity,不管多少维数组,都扁平化为一层。
还有个方法flatMap,支持传入函数,对数组的每一项进行遍历,返回新数组,然后对新数组执行flat方法(默认一层)。
[1,2,3].flatMap((item) => [ item * 2 ]) //[2,4,6]
[1,2,3].flatMap((item) => [ [item * 2] ]) //[[2],[4],[6]]
copyWithin(index, start, end)
把数组的某些item复制,到数组的另一个地方并替换它。 直接操作原数组。
index 代表替换的起始位置。负数代表从尾部算。必填
start 复制的起始位置。负数代表从尾部算。默认是0。 可选
end 复制的结束位置(不包含)。负数代表从尾部算。默认是数组的长度。可选
var arr = ['a','b','c','d','e']
arr.copyWithin(1,3,4) // 把 d复制替换了b ['a', 'd', 'c', 'd', 'e']
var arr = ['a','b','c','d','e']
arr.copyWithin(0,-3,-2) // 把 d复制替换了b ['c', 'd', 'c', 'd', 'e']
fill(item, start,end)
这个是用提供的item去填充数组,替换数组的值。
start是起始位置,默认是0。支持负数(从尾部计算)。
end是结束位置(不包含)。 默认是数组的长度。支持负数(从尾部计算)。
console.log([1,2,3,4,6].fill(3)) // [3, 3, 3, 3, 3]
console.log(['a', 'b', 'c', 'd'].fill('e', 0, 1)) // ['e', 'b', 'c', 'd']
console.log(['a', 'b', 'c', 'd'].fill('e', -2, -1)) // ['a', 'b', 'e', 'd']