【问题标题】:What's the difference between empty items in a JavaScript array and undefined? [duplicate]JavaScript 数组中的空项和未定义有什么区别? [复制]
【发布时间】:2018-10-23 20:40:48
【问题描述】:

考虑以下 JavaScript 代码(在节点 REPL 中):

> let a = new Array(10)
undefined
> a
[ <10 empty items> ]
> a.map(e => 1)
[ <10 empty items> ]
> let b = new Array(10).fill(undefined)
undefined
> b
[ undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined ]
> b.map(e => 1)
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
> 

当我创建一个空数组时,我会得到看起来与undefined 不同的“空项目”。谁能解释一下有什么区别?

【问题讨论】:

  • 在第一种情况下可能只设置了长度。
  • 空槽不会在您的 Array 对象上设置“索引键”,因此某些方法不会去那里。
  • @Mihai 您的编辑不反映原始问题的标题或正文。

标签: javascript arrays undefined


【解决方案1】:

当我创建一个空数组时,我会得到“空项目”,这似乎 行为与未定义不同。有人可以解释什么是 区别?

那是因为Array(10) 没有填充数组。但它只是将 length 属性设置为 10 。因此,使用 Array 构造函数创建的数组只是一个具有长度属性的对象,但没有填充任何项目。

【讨论】:

    【解决方案2】:

    那是因为undefined 是一个值,而当您创建一个数组时,例如:

    var array = [];
    array.length = 10;
    console.log(array);
    >(10) [empty × 10] // in google chrome
    

    创建了 10 个空槽。 空槽与未定义的值不同,最重要的区别是空槽不是可枚举的。

    var mappedArray = array.map(x => 1);
    console.log(mappedArray);
    >(10) [empty × 10] // in google chrome
    

    由于map函数会枚举原始数组中的值并返回相同长度的数组,所以对10个空槽的数组没有影响。

    请注意,不同浏览器中的空插槽名称不同。

    【讨论】:

    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 2011-03-21
    • 2011-12-29
    • 1970-01-01
    • 2019-01-17
    • 2023-03-15
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多