为什么控制台记录,注销已经分配为新分配的变量

Why does console log, log out a variable thats already been assigned as the new assignment

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

如果有人能解释为什么会这样,那就太好了。

请看这个问题:console.log() shows the changed value of a variable before the value actually changes。这是 发生在 console.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

P.S Javascript 充斥着这些怪癖。不是要让你气馁,但应该是的往往不是它的本来面目。这个例子也与 javascript 中的异步编程非常相似,这可能会让那些来自过程背景的人感到不快。为了过于简单化,您的值将在您到达下一行之前在幕后发生变化,因此最好了解事件循环、回调和随后的承诺以及 async/await.