为什么记录的数组总是充满数据?它不应该是一个只有一个然后两个然后三个数组的数组吗?
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);
}
答案 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
复制数组(或对象)的值,返回一个新的数组(再次或对象),但不创建对原始数组或对象的引用。