JavaScript创建数组有几种方法?

1,200 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

创建数组的方法有以下几种:

  1. 数组字面量
  2. 对可迭代对象使用...扩展操作符
  3. Array()构造函数
  4. 工厂方法Array.of()
  5. 工厂方法Array.from()

数组字面量

数组字面量就是一对方括号中逗号分割的数组元素的列表。数组字面量是创建数组最简单的方式,数组字面量中的值可以是任意表达式。

let empty = []
let prime = [1,2,3]
let misc = ['a', true, 1, 2, {a: 'good'}, prime, empty]

数组字面量中连续包含多个逗号,且逗号之间没有值,则这个数组是稀疏的。这些省略了值的数组元素并不存在,索引查询会返回undefined

let count = [1, ,3]//索引0和2有元素,索引1没有元素。
let undefs = [,,]//数组字面量允许末尾出现逗号,因此这个数组没有元素但长度为2。

扩展操作符

扩展操作符是创建数组副本的一种便捷方式,适用于可迭代对象。(注:可迭代对象是可以用for/of循环遍历,包括字符串,数组,集合,映射)。

//数组浅拷贝
let original = [1,2,3]
let copy = [...original]

//字符串转为单个字符数组
let digits = [...'12345']
digits//['1','2','3','4','5']

//将集合元素转换为数组
let letters = [...new Set('aabbccdd')]
letters// ['a', 'b', 'c', 'd']

Array()构造函数

Array()构造函数有三种调用方式

  1. 不传参数调用,创建一个空数组
let a = new Array()//=> []
  1. 传入一个数值参数,指定数组长度
let a = new Array(4)//=>[,,,,]
  1. 传入两个或多个数组元素,或一个非数值元素
let a = new Array(1,2,3,4)//=>[1,2,3,4]

let a = new Array('abc')//=>['abc']

Array.of()

Array.of()函数的参数作为数组元素来创建并返回新数组。Array.of()函数可以解决Array()构造函数无法创建只包含一个数值元素的数组的问题。

Array.of() //=>[]
Array.of(4) //=>[4]
Array.of(1,2,3,4) //=>[1,2,3,4]

Array.from()

Array.from()期待一个可迭代对象类数组对象作为其第一个参数,并返回包含该对象元素的新数组。Array.from()定义了一种给类数组对象创建真正的数组副本的机制

let trueArray = Array.from(arraylike)

Array.from()可以接收可选的第二个参数。如果给第二个参数传入一个函数,在构造新数组时,原对象的每个元素都会传入这个函数,函数的返回值将作为新数组的元素。这和数组map()方法有点像,但是效率要高于先构建一个数组再把它映射为另一个新数组。

let doubleArr = Array.from('1234', num=>num*2)//=>[2,4,6,8]
//类似于,但前者效率更高。
doubleArr = Array.from('1234').map(num=>num*2))

总结

上面介绍了5中创建数组的方法,我们应该根据不同场景选择合适的数组创建方式:

  • 数组字面量是最简单最常用的数组创建方式;
  • 扩展操作符更适用于基于可迭代对象创建数组副本场景;
  • Array()构造函数更适用于创建稀疏数组;
  • Array.of()工厂函数弥补了Array()构造函数无法创建只包含一个数值元素的数组的不足。
  • Array.from()工厂函数提供了基于类数组对象创建数组副本的方式。