【问题标题】:Is it okay to deliberately skip array elements using the comma operator?可以使用逗号运算符故意跳过数组元素吗?
【发布时间】:2011-09-04 05:02:07
【问题描述】:
var array = [,, "cat", "dog"];

这将创建一个包含两个空值的数组(以便我以后可以使用它们)。如果不做缓慢而乏味的array[2] = "cat"; array[3] = ...,我想不出任何其他方法来做到这一点,这是一个好方法吗?或者是否有其他推荐的做法来模拟这种能力。

【问题讨论】:

  • 为什么需要这样的数组?
  • 有一次我需要在一个预填充数组的前面放一些东西。我忘了它是什么,但它提出了这个问题。
  • 你可以使用array.unshift(value)

标签: javascript


【解决方案1】:

是的。 holes 不会被定义,但会影响数组长度。

The spec [ref] 允许:

数组元素可以在元素列表的开头、中间或结尾被省略。每当逗号在 元素列表前面没有 AssignmentExpression(即,逗号在开头或在另一个之后 逗号),缺少的数组元素会增加数组的长度并增加 后续元素。省略的数组元素未定义。

但是,正如 pimvdb 所指出的,它是可能的这一事实并不一定意味着它是一种好的做法。

【讨论】:

  • 它是可能的事实并不一定意味着这是一个好的做法,IMO。
  • 您可以随时添加某种类型的 cmets 以澄清这些孔是故意的:array=[ /* 0 */, /* 1 */, "cat", "dog" ]
  • ...或者只是使用一个对象,您甚至不需要在其中包含奇怪的“空白”元素 - 只需将您想要映射到值的数字键,并在需要时添加新键.
  • 请注意,作为规范。表示,元素将未定义,即bit different than being undefined,对应的数字属性将不存在,例如:'0' in [,]; // false(IE几个 Array Initialiser 语法上的错误)
【解决方案2】:

最初的代码看起来像一个错误。

如果您真的想要 undefined 值,那么绝对清楚会很有帮助。

var array = [undefined,undefined, "cat", "dog"];

不是更好,但您也可以执行以下操作。

var array = ["cat", "dog"];
array.unshift(undefined,undefined);

它绝对有效,但不一定干燥清晰。

【讨论】:

  • array.unshift(undefined,undefined) 也可以使用,因为您可以传递多个参数,就像 .push()
【解决方案3】:

是的,没关系。本质上,您所做的是声明一个包含四个元素的数组,但不必为前两个输入undefined。但是,如果您希望长度等于 4,则必须采用另一种方式。

您的数组似乎是一个元素列表,其中索引到值的映射很重要。如果是这种情况,您可以考虑改用一个对象,这(我认为)会更整洁:

var obj = { 2: "foo", 3: "bar"};
alert(obj[2]);
// later
obj[4] = "baz";
alert(obj[4]);

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2010-11-28
    • 1970-01-01
    • 2015-01-23
    • 2013-04-08
    相关资源
    最近更新 更多