【问题标题】:Why do Array literals with commas but no elements not have a length of 0? [duplicate]为什么带有逗号但没有元素的数组文字的长度不为 0? [复制]
【发布时间】:2016-04-01 01:44:19
【问题描述】:

我只是在摆弄一些 JS,发现了一些我认为不会发生的事情。

var arr = [,];
arr.length // 1
arr[0] // undefined

此外,[,,] 的长度为 2。这些数组的长度不应该为 0 吗?我认为逗号仅用于分隔数组中的元素,那么为什么逗号似乎被视为这些特定数组中的元素?这种对数组的行为有什么应用吗?

【问题讨论】:

标签: javascript


【解决方案1】:

【讨论】:

  • 仅根据您的回答,[,] 和 [] 不会相同吗?
  • @ei 不,[,]=[undefined,]=[undefined]。另一个是 []。
  • 我知道,但我没有看到你在回答中这么说。
【解决方案2】:

这叫做省略。它在数组(稀疏数组)中创建了一个“洞”。可能有一些我不知道和忘记的应用程序,我现在唯一能想到的就是我在这里展示的那个:https://stackoverflow.com/a/29629588/1034448。

[,...Array(10)].map((x, i) => { /* range of `i` is 1 - 10 */ })

[,,]不等同于[undefined, undefined,]。有一个很大的区别:迭代方法不会包含省略索引处的元素。 Example:

var enumerated = [];

function callback (x, i) {
  enumerated.push(i);
}

[,,].forEach(callback);
console.log(enumerated); // logs []

[undefined, undefined,].forEach(callback);
console.log(enumerated); // logs [1, 2]

【讨论】:

    【解决方案3】:

    在数组文字中,末尾的逗号被忽略,但所有其他逗号分隔元素。如果省略元素的值,则默认为undefined,但该元素仍然存在。所以

    [,]
    

    等价于

    [undefined,]
    

    相当于

    [undefined]
    

    这有 1 个元素,其值为 undefined。

    同样

    [,,] = [undefined, undefined, ] = [undefined, undefined]
    

    其中有 2 个元素。

    当您想省略数组中间的元素时,默认元素行为更有用。

    [1, 2, 3, , , 6, 7, 8]
    

    实际上,这两种创建未定义元素的方法之间存在细微差别。在 Javascript 中,数组实际上是一个对象,它具有 length 属性和名称是数组元素索引的属性。通常,如果数组有length = N,则索引属性将是从0 到N-1 的所有整数。但是,当您在数组字面量中省略一个元素时,不会为该索引创建任何属性。

    在大多数情况下,这个缺失的属性并不重要,因为访问对象的不存在属性会返回undefined,就像您有一个值为undefined 的属性一样。您只能通过使用hasOwnProperty 之类的方法或调用Object.keys 来检测这些缺失的属性。 Javascript 控制台使用类似这样的东西来显示数组中的间隙,与显式 undefined 元素不同。

    所以

    Object.getOwnPropertyNames([1, 2, 3]) => ["0", "1", "2", "length"]
    Object.getOwnPropertyNames([1, , 3, 4]) => ["0", "2", "3", "length"]
    Object.getOwnPropertyNames([, , , , ]) => ["length"]
    

    忽略最后一个逗号的原因是这样你可以写:

    [ 
        "foo",
        "bar",
        "baz",
        "quux",
    ]
    

    这使编辑更容易,因为您可以插入和删除行,而不必对最后一个元素进行特殊处理。

    【讨论】:

    • 我也在想同样的事情,但控制台显示[,,] 和[undefined, undefined] 之间略有不同。那是[,,] = [undefined × 2]。这是什么原因,只是我的浏览器吗?
    • 这就是控制台显示稀疏数组的方式。
    • 所以可以安全地假设如果逗号前没有任何内容,则默认为undefined,?
    • 其实还是有区别的。我会更新答案。
    猜你喜欢
    • 2018-12-02
    • 2023-01-31
    • 2019-01-31
    • 2019-11-23
    • 2021-04-06
    • 1970-01-01
    • 2017-02-14
    • 2022-06-23
    • 1970-01-01
    相关资源
    最近更新 更多