javascript - 为什么控制台记录,注销已经分配为新分配的变量
问题描述
我对 Javascript 有点陌生,想要澄清一些事情,我读过一些关于提升的东西,觉得这可能是我问题的原因和答案,但是为什么日志会注销我的常量的最后一个分配?
const people = [
{
name: "Roger",
age: 29,
role: "Secret Agent"
},
{
name: "Jamie",
age: 35,
role: "Secret Agent"
}
]
console.log("people", people);
people[0].name = 'bob';
console.log("people", people);
两个结果都显示 bob 而不是 Roger 然后是 Bob。
如果有人能解释为什么会发生这种情况,那就太好了。
解决方案
这是一个实现怪癖。Chrome (V8) 和 Firefox (SpiderMonkey) 将在您在控制台中展开对象时解析该对象。在幕后,价值可能已经改变。WebKit (Safari) 将按原样记录它。如果要在某个时间点按原样捕获对象,请使用console.log(JSON.parse(JSON.stringify(obj)));
[1] https://developer.mozilla.org/en-US/docs/Web/API/Console/log#Logging_objects
PS Javascript 充斥着这些怪癖。不是要让你气馁,但应该是经常不是它是什么。此示例还与 javascript 中的异步编程非常相似,这可能会令那些来自程序背景的人感到震惊。简单地说,你的值会在你到达下一行之前在幕后发生变化,因此了解事件循环、回调以及随后的 promises 和 async/await 是一个好主意。
推荐阅读
- jquery - 删除项目后如何禁用可拖动?
- mysql - 在 Django 中将未知对象类型保存到数据库中
- java - 使用 Spring 创建 MapStruct bean 时出错
- css - Bootstrap 4 导航栏在点击图标时关闭
- prolog - Prolog 中的“isDuped”谓词
- android - 如何在使用表 B 凭据时从表 A 中查询数据?
- python-3.x - 关于 Sublime Text3 中的 isort 插件?
- html - 使用不带参数的 mixin 是否比使用 extend 更有效
- vim - 如何在 NERDTree 中按扩展名显示文件?
- html - Bootstrap 4 - 扩大导航栏的内联表单输入