我正在尝试执行一个循环并使用每个循环值更新一个对象属性,但是发生了意外情况:
第一个console.log
打印day
对象属性,该属性已按预期更新。但是,第二个打印完整的对象,显示了day
属性,其值为 final forEach
值。
示例:
data.days = [ 5, 6 ]
第一次循环打印:
newData.date: 5
{prop1: x, prop2: x...., date: 6}
第二个循环打印:
newData.date: 6
{prop1: x, prop2: x...., date: 6}
这是我的代码:
data.days.forEach(day => {
let newData;
newData = data.data;
newData.date = day;
console.log('newData.date: ' + newData.date)
console.log(newData)
})
我尝试从newData
或forEach
循环中创建for
变量,但结果相同。
答案 0 :(得分:1)
您看到的问题是由于以下事实引起的:浏览器控制台在试图记录对象时没有尝试记录字符串,这很有帮助。相反,它正在记录该对象的实时视图。因此,如果您记录该对象然后对其进行更新,您将在控制台中看到更新的版本。但是,当您记录对象的属性时,控制台会将其记录为静态字符串。
您可以在这里看到此内容:
该字符串只是作为静态字符串记录,但是该对象经过特殊处理,并带有语法突出显示和扩展属性视图等。
在此示例中,我们记录了对象的静态字符串化版本以及对对象的动态引用:
let days = [5, 6];
let newData = {};
days.forEach(day => {
newData.date = day;
console.log('newData.date: ' + newData.date);
console.log(JSON.stringify(newData));
console.log(newData);
});
这将产生:
答案 1 :(得分:1)
您的问题在这里:
line 51, in EnemySpawn
enemyspawn = EnemySpawn()
TypeError: 'Thread' object is not callable
您不是在使用...
let newData;
newData = data.data;
...
变量创建新对象,而是在每次迭代中仅将相同的newData
对象引用到其中。这就是为什么最终的data.data
值始终是上一次循环迭代中设置的值的原因。
如果每个循环都需要一个新的不同对象,则需要(深度)克隆/复制newData
而不是仅仅引用它:
data.data
注意:Object.assign会进行对象的浅表复制,如果需要对对象进行深表复制,则需要采取其他措施。
答案 2 :(得分:0)
对象没有forEach
方法(主要用于数组),但是您可以使用for (let prop in object)
对其对象进行迭代。
在您的示例中:
for (let day in data.days) {
// Do your stuff
}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
答案 3 :(得分:0)
根据ECMAScript文档, a link
在22.1.3.12 Array.prototype.forEach(callbackfn [,thisArg])
callbackfn应该是一个接受三个参数的函数。 forEach对数组中存在的每个元素按升序调用一次callbackfn。 callbackfn仅针对实际存在的数组元素进行调用;不会因为缺少数组元素而调用它。