Why array created by Array(3) don't have index 0, 1, 2?

时间:2018-05-09 02:47:15

标签: javascript arrays

Array(3), result:

{ length: 3__proto__: Array(0) }

There is no index 0, 1, 2...

But Array.call(null, Array(3)) has,

{ 0: undefined, 1: undefined, 2: undefined, length: 3, __proto__: Array(0) }

I know I can get indexs by Array.from or Array.fill.

I just want to know why Array.call(null, Array(3)) can produce the indexs. I want to know the inner logic of Array.call(null, Array(3)), What does it exactly do ?

Could anyone explain why?

2 个答案:

答案 0 :(得分:0)

实际上,您可以使用Array.from转换数组,就像这样

Array.from(Array(3),(val,index)=>index)
// [0, 1, 2]

答案 1 :(得分:0)

Array.length是可读写的。设置内部长度参考不会自动创建空值。通过实例化阵列Array(5),您可以设置内部长度,但会创建一个空白数组。如果要在其索引中推送一个值为6,但该数组仍然只包含一个项目。

在控制台中运行这些示例。他们是等同的。

let a = Array(5)
a.push('foo') // length 6
a.push('bar') // length 7
a // [empty × 5, "foo", "bar"]

let b = []
b.length = 5
b.push('foo') // length 6
b.push('bar') // length 7
b // [empty × 5, "foo", "bar"]

a.forEach(i => console.log(i))
// foo
// bar

使用Array.call(null, 5)会产生与上面相同的结果。它基本上调用Array(5),其上下文为null; Array.call(null, Array(3))正在创建一个嵌套数组,第一个值是一个设置为长度为3的数组。

这个答案Create a JavaScript array containing 1...N

中描述了一种简短的方法
var N = 10; 
Array.apply(null, {length: N}).map(Number.call, Number)