请补全JavaScript代码,要求返回一个长度为参数值并且每一项值都为参数值的数组。
注意:请勿直接使用for/while
const _createArray = (number) => {
// 补全代码
}
我的思路
下意识的想法是 使用Array(number)
去创建长度为number的空数组,再用数组的forEach
或map
方法赋值即可,结果发现该数组不会被遍历,原因是:
forEach方法会按升序为数组中含有效值的每一项执行一次callback函数,而那些已删除(使用delete方法等情况)或未初始化的项将被跳过(但不包括值为undefined的项)
所以说,通过Array(number)
或new Array(number)
创建的数组是一个有length属性的空数组,其中的每一项都还未被赋值(初始化),故会被forEach
和map
等方法跳过
Array(3) // [empty x 3] length:3
new Array(3) // [empty x 3] length:3
解题思路
创建指定长度的数组
思路1:Array.apply()
方法
Array.apply()
方法接收两个参数,第一个为调用时指定的上下文,第二个为一个数组或者类数组对象
Array.apply(null/0/[]/..., {length: 10})
Array.apply(null/0/[]/..., Array(10))
Array.apply(null/0/[]/..., new Array(10))
// 这三个方法相当于
Array(undefined, undefined, undefined, ...)
Array构造函数会根据给定的arguments来创建一个数组(如果不是仅有一个参数且为数字的话), 通过Array.apply传入一个length为10的空数组则相当于, 把一个空数组中的每一个元素的值逐个传入Array()方法, 而空数组中的每一个元素的值都是 undefined
思路2:es6提供了的一个新的api,Array.from()
方法
Array.from()
方法可以接受数组或类数组对象作为参数,(类数组对象,即类似数组的对象,本质特征只有一点,即必须有length属性)任何有length属性的对象,都可以通过Array.from方法转为数组
Array.from({length:5})
// [undefined, undefined, undefined, undefined, undefined]
Array.from(Array(5))
// [undefined, undefined, undefined, undefined, undefined]
思路3:es6的另一种写法,扩展运算符
Array(...Array(5))
[...Array(5)]
// [undefined, undefined, undefined, undefined, undefined]
以上三种方法,都可生成被forEach或map等方法遍历的指定长度,值为undefined的数组
给指定长度的数组赋值
接下来就只需要赋值,除了forEach或map等遍历数组进行赋值的方法,我们还可以用Array.fill()
方法或用上Array.from()
的第二个参数
思路1:Array.fill()
方法
可以将数组的每一项都改编为指定的参数值
Array(3).fill(3)
// [3, 3, 3]
思路2:Array.from()
的第二个参数
Array.from()
方法接收两个参数时,第一个参数为数组或类对象,参数的length属性确定返回数组的长度,第二个参数为一个函数,第一个数组参数中的每一项都调用该函数
Array.from({length:5},()=>5)
// [5, 5, 5, 5, 5]
通过代码
const _createArray = (number) => {
// return Array.from(Array(number)).fill(number)
// return Array.from({length:number},()=>number)
// return Array(number).fill(number)
// return [...Array(number)].fill(number)
}