【问题标题】:JavaScript: Initialize Object array with invalid indexJavaScript:使用无效索引初始化对象数组
【发布时间】:2015-04-24 14:04:07
【问题描述】:

例如,我创建构造函数并初始化对象数组(JS)

function SomeConstruct(val1, val2) {
    this.val1= val1;
    this.val2= val2;
}


var someCons= new Array();
someCons[0] = new SomeConstruct(12, 40);
someCons[1] = new SomeConstruct(34, 42);
someCons[2] = new SomeConstruct(0,-5);

然后我创建索引为 [5] 的新对象,尽管数组的最后一个索引是 [2]

someCons[5]=new SomeConstruct(43,232);

但是这段代码有效,但是当我尝试访问对象 [3] 或 [4] 时出现错误

我怎样才能防止这种行为 - 例如,我有一些循环,我在某些条件下(val1==1)将新对象添加到数组中,但在某些时候,这个逻辑会中断,我错过了上面的数组索引和创建 [5] 而不是 [3] 元素? 为什么 JS 会允许这种行为?

【问题讨论】:

  • 任何字符串都将用作 JavaScript 对象的属性名称。
  • 我相信您会在这里找到答案:SO 简而言之,如果您愿意,可以使用对象而不是数组,并且您可以使用 for-in 枚举来获取数据。

标签: javascript arrays object


【解决方案1】:

如何防止这种行为

使用push method 将元素添加到数组,而不是分配给可能超出实际数组的固定索引。

为什么 JS 允许这种行为?

因为arrays in JS are sparse。毕竟,您总是可以在对象数组中拥有一个undefined 值。如果您真的必须处理它们,则需要跳过迭代中缺少的索引(forEach 也这样做)。

【讨论】:

    【解决方案2】:

    使用上述push 方法的替代方法是 -

    someCons[someCons.length] = new SomeConstruct(val, val);  
    

    它做同样的事情 - 将新构造添加到数组中的当前最后一个位置。

    【讨论】:

      【解决方案3】:

      在 JavaScript 中,如果您将值分配给 Array 的某个随机索引,则以下行为,我在浏览器控制台上尝试了此代码:

      a = new Array(10);
      

      [未定义×10]

      a = new Array()
      

      []

      a.length
      

      0

      a[10] = "a"
      

      “一个”

      a[1]="b"
      

      “b”

      a
      

      [未定义×1,“b”,未定义×8,“a”]

      a[20]=30;
      

      30

      a
      

      [未定义×1,“b”,未定义×8,“a”,未定义×9,30]

      为了防止这种情况,您可以像这样将元素推送到数组中

      var arrSomeCons= new Array();
      someCons = new SomeConstruct(12, 40);
      arrSomeCons.push(someCons)
      

      【讨论】:

        【解决方案4】:

        在您的情况下,当数组的最后一个索引是 [2] 并且您在 [5] 中创建新对象时,[3] 和 [4] 变得未定义,因为您没有声明它们。如果你想连续做并且不漏掉任何索引,你可以使用push,或者使用这样的代码:

        for(i = 0; i < 10; i++)
          array[i] = new Constr();
        

        for(some conditions to declare variables)
           array.push(new Constr(variables));
        

        array.push( elem1, elem2, ... )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-23
          • 2021-05-04
          • 1970-01-01
          • 2013-02-04
          • 2018-06-22
          • 1970-01-01
          • 2017-02-16
          相关资源
          最近更新 更多