首页 > 解决方案 > 为什么控制台记录,注销已经分配为新分配的变量

问题描述

我对 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。

如果有人能解释为什么会发生这种情况,那就太好了。

标签: javascriptecmascript-6console.log

解决方案


这是一个实现怪癖。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 是一个好主意。


推荐阅读