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?
答案 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)