JavaScript:使用无效索引初始化Object数组

时间:2015-04-24 14:04:08

标签: javascript arrays object

例如,我创建构造函数并初始化对象数组(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允许这种行为?

4 个答案:

答案 0 :(得分:1)

  

如何防止此行为

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

  

为什么JS允许这种行为?

因为arrays in JS are sparse。毕竟,您可以在对象数组中始终具有undefined值。如果你真的需要处理它们,你需要在迭代中跳过缺失的索引(forEach也会这样做。)

答案 1 :(得分:1)

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

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

执行相同的操作 - 将新构造添加到数组中的当前最后位置。

答案 2 :(得分:0)

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

a = new Array(10);

[undefined×10]

a = new Array()

[]

a.length

0

a[10] = "a"

“一”

a[1]="b"

“B”

a

[undefined×1,“b”,undefined×8,“a”]

a[20]=30;

30

a

[undefined×1,“b”,undefined×8,“a”,undefined×9,30]

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

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

答案 3 :(得分:0)

在你的情况下,当数组的最后一个索引是[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, ... )