【问题标题】:Difference between Array(n) and Array(n).fill?Array(n) 和 Array(n).fill 之间的区别?
【发布时间】:2016-05-03 00:17:51
【问题描述】:

我注意到如果我这样做:

Array(n).map(() => console.log('test'))

我什么也没打印出来。

但是如果我这样做:

Array(n).fill().map(() => console.log('test'))

我得到test 打印出n 次。

为什么会这样?如果我这样做Array(n).length,我会返回n

我在 REPL 中注意到 Array(5) 返回:

[ , , , , ]

Array(5).fill() 返回:

[ undefined, undefined, undefined, undefined, undefined ]

在这两种情况下,typeof 数组中的任何元素 === undefined

那么,发生了什么事?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    我需要使用 minValue、maxValue 和精度来创建刻度。因此,例如,当 minValue = 5、maxValue = 7、precision = 0.5 时,我应该得到数组 [5, 5.5, 6, 6.5, 7]。我使用了以下内容(基于上面的答案):

    const tickCount = ((maxValue - minValue) / precision) + 1
    const ticks = Array(tickCount)
      .fill()
      .map((x, i) => minValue + i * precision)
    

    【讨论】:

      【解决方案2】:

      map 仅对数组的已定义整数属性进行操作。 Array(n) 不设置整数属性,而 Array(n).fill() 设置。 不存在的属性值为undefined的现存属性之间存在区别

      Array(n) 设置数组的length 属性,但它不设置任何属性。数组对象没有任何整数属性。

      .fill 将数组的所有整数属性设置为从零到比length 小一。当您执行Array(n) 时,您设置了新数组的length 属性,然后.fill() 定义并将每个整数属性设置为n-1Array(n).fill() 创建的数组确实 具有定义为length - 1 的属性。 (属性恰好设置为undefined,因为您没有将参数传递给fill,但它们确实存在。)

      实际上,如果您使用Object.keys(Array(4))(空数组)与Object.keys(Array(4).fill())(字符串列表"0""3"),您可以看到区别。在第一种情况下,属性不存在;在第二种情况下,他们会这样做。

      【讨论】:

        【解决方案3】:

        Array(n) 创建一个大小为 n 的新数组,内容尚未定义。

        Array(n).fill() 创建一个大小为 n 的数组,其中每个元素都设置为您传递给 fill 或 undefined 的任何内容,因为您什么也没传递。

        Array(n).fill('test') 创建一个大小为 n 且填充了“测试”的数组。

        【讨论】:

          猜你喜欢
          • 2019-01-28
          • 1970-01-01
          • 1970-01-01
          • 2016-04-15
          • 1970-01-01
          • 2018-08-30
          • 2012-05-21
          • 2016-05-12
          相关资源
          最近更新 更多