【问题标题】:Why array created by Array(3) don't have index 0, 1, 2? [duplicate]为什么由 Array(3) 创建的数组没有索引 0、1、2? [复制]
【发布时间】:2018-10-19 01:35:39
【问题描述】:

Array(3),结果:

{ length: 3__proto__: Array(0) }

没有index0, 1, 2...

但是Array.call(null, Array(3)) 有,

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

我知道我可以通过 Array.from 或 Array.fill 获取索引。

我只想知道为什么 Array.call(null, Array(3)) 可以产生索引。我想知道Array.call(null, Array(3))的内在逻辑,它到底是做什么的?

谁能解释一下原因?

【问题讨论】:

  • Array(3).fill() 太难了,为什么?
  • Why Array(5) don't have index 0, 1, 2, 3? 它也没有索引 4 - 只是说 :p - 你想在文档中查找的是 sparse array
  • @31 不,它没有重复,我知道 Array 和 new Array 是一样的,我想知道为什么 Array()/new Array() 没有索引,与 Array.call 相比()。
  • @PatrickRoberts,我知道 Array.fill 可以做到。我只想知道是否有其他方法可以在没有它的情况下创建带索引的数组。

标签: javascript arrays


【解决方案1】:

其实,你可以使用Array.from来变换数组,像这样

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

【讨论】:

    【解决方案2】:

    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),上下文为nullArray.call(null, Array(3)) 正在创建一个嵌套数组,第一个值是一个长度为 3 的数组。

    这个答案Create a JavaScript array containing 1...N中描述了一种短手方式

    var N = 10; 
    Array.apply(null, {length: N}).map(Number.call, Number)
    

    【讨论】:

      猜你喜欢
      • 2017-12-20
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2019-01-09
      • 2020-11-23
      相关资源
      最近更新 更多