动态创建的数组始终充满变量

时间:2018-07-03 12:56:04

标签: javascript multidimensional-array

为什么记录的数组总是充满数据?它不应该是一个只有一个然后两个然后三个数组的数组吗?

var theArray=[];
function insertValues(species,quantity){
    var w = window;
    w[species]= [];
        for(let i =0; i<quantity;i++){
            w[species].push({
                species:species,
                randomValue:Math.random()*10
                })
                // console.log(theArray);
        }

    theArray.push(w[species]);
}

var listOfSpecies =[{animal:"Fish",amount:5},{animal:"Shark",amount:5},{animal:"Algae",amount:5}];

for(let i = 0; i<listOfSpecies.length; i++){
    console.log(theArray);

    insertValues(listOfSpecies[i].animal,listOfSpecies[i].amount);
}

1 个答案:

答案 0 :(得分:0)

哇!首先,不要分配给窗口! (出乎意料的事情几乎肯定会发生)。

此外,JavaScript对象(是一个数组,是一个对象,typeof [] === "object" // true)是通过引用而不是通过值传递的。

当您添加到theArray时,将创建一个新引用。当您将其记录到控制台时,它首先显示一个空数组 ,但实际上它已经记录了对theArray的引用,因此,当您检查内容时,它会显示一个充满值的数组;

即使尝试下面的示例,也会发生相同的事情(尽管遵循起来要简单得多)

var arr = [];
for (var idx = 0; idx < 3; idx++) {
    console.log(arr);
    arr[idx] = idx;
}

为防止这种情况,您需要复制数组,如下所示:

var newArray = Object.assign([], theArray);

Object.assign复制数组(或对象)的值,返回一个新的数组(再次或对象),但不创建对原始数组或对象的引用。