javascript - 使用 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()
而对于其余的,让.startTime
null
timerObj
i
奇怪的是,在运行 for 循环之后,我看到 for allDate.now()
已经设置好了。我知道 Javascript 对象是可变的,但为什么所有索引都设置为Date.now()
?
我查看了Object
与称为“冻结”的概念相关的其他 Javascript 相关问题,但不确定我的基础知识是否正确。
编辑:我认为这与正在更改的对象引用有关..
解决方案
Javascript 不复制对象。它传递引用,因此当您分配timers[i] = timerObj
一次,然后分配Date.now()
一次时,此值将转到您的 single timeorObj
。timerObj
to timers[i]
for all的所有后续分配指的是您定义i
的单曲。timerObj
要解决此问题,请强制复制: timers[i] = JSON.parse(JSON.stringify(timerObj));
这会将您的 clean 序列化为timerObj
JSON 字符串,然后将其转换回新的 javascript 对象,然后将新对象分配给timers[i]
.
这样,您最终会在阵列timerObj
的每个插槽中获得副本。timers
推荐阅读
- html - Twitter JS文件问题
- r - 如何修复加载 tidyverse 库的错误
- python - SVM Scikit,是否可以像在 LinearSVC 中那样更改 SVC 的惩罚?
- c++ - 为什么我的类节点会覆盖自己而不是创建新的节点对象
- javascript - 启动/停止 MediaRecorder API 会导致 Chrome 崩溃
- powershell - MFA 对公司管理员的强制执行 Powershell
- java - 使用 IntelliJ 社区版调试器的对象大小
- python - 试图从具有相同链接的多个页面中抓取
- linux - 如何在 Linux 中同时为用户创建 hdfs 目录?
- mysql - 警告:安装后步骤未成功完成,尝试在 Mac OS High Sierra 中使用 brew 安装 mysql