总结下es6数组新增的常用用法

112 阅读3分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

问题

面试官: 你能讲讲扩展运算符吗?

面试者: 巴拉巴拉。。。它主要是把数组结构转成序列,通常用于合并数组,拷贝数组(浅拷贝)等。

面试官:那你能讲讲Array.of的用法?

面试者: 它主要把类数组转成数组

面试官:这个好像是Array.from的用法哦?

面试者: 再给我一次机会。。。

以上纯属虚构,不知道会不会雷同。

下面总结es6数组新增的常用用法,包括扩展运算符Array.of, Array.from等。

数组

扩展运算符

扩展运算符用...表示,后面跟着需要转换的数据,需要是具有Iterator接口。

以下数据具有Iterator接口

  • 数组
  • Map
  • Set
  • 字符串
  • 类数组,比如NodeListarguments

扩展运算符是把具有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']

参考

数组的扩展