首页 > 解决方案 > 使用 for 循环和 if 语句错误地设置嵌套对象中的键值

问题描述

这是您可以在控制台中键入的示例。Javascript 的超级新手。该示例可以通过打开一个新选项卡并在控制台中输入来重现(JSX Fiddle 的控制台功能处于测试阶段,所以我不确定它是否可以信任)

let clothing = ['card0', 'card1', 'card2', 'card3'];
let timers = {}
let timerObj = {"startTime": null, "pauseTime": null, "elapsedTime": null, "hasSubmitted": false} //Nested object I want for all indices, will manipulate 0th index alone inside for loop

for (var i = 0; i < clothing.length; i++) {
  timers[i] = timerObj
  if (i == 0) {
    timers[i]["startTime"] = Date.now();
  } 
} 
console.log(timers) 

我打算做的是,仅对于第 0 个索引,将其设置为timers[0]["startTime"]Date.now()而对于其余的,让.startTimenulltimerObj

i奇怪的是,在运行 for 循环之后,我看到 for allDate.now()已经设置好了。我知道 Javascript 对象是可变的,但为什么所有索引都设置为Date.now()

我查看了Object与称为“冻结”的概念相关的其他 Javascript 相关问题,但不确定我的基础知识是否正确。

编辑:我认为这与正在更改的对象引用有关..

标签: javascriptfor-loopobjectif-statement

解决方案


Javascript 不复制对象。它传递引用,因此当您分配timers[i] = timerObj一次,然后分配Date.now()一次时,此值将转到您的 single timeorObjtimerObjto timers[i]for all的所有后续分配指的是您定义i的单曲。timerObj

要解决此问题,请强制复制: timers[i] = JSON.parse(JSON.stringify(timerObj));

这会将您的 clean 序列化为timerObjJSON 字符串,然后将其转换回新的 javascript 对象,然后将新对象分配给timers[i].

这样,您最终会在阵列timerObj的每个插槽中获得副本。timers


推荐阅读