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