Javascript 为什么控制台要记录、注销一个已经分配为新分配的变量

Javascript 为什么控制台要记录、注销一个已经分配为新分配的变量,javascript,ecmascript-6,console.log,Javascript,Ecmascript 6,Console.log,我对Javascript有点陌生,想澄清一些事情,我读了一些关于提升的文章,觉得这可能是我问题的原因和答案,但是为什么日志,注销我常数的最后一个赋值 const people = [ { name: "Roger", age: 29, role: "Secret Agent" }, { name: "Jamie", age: 35, role: "Secret Agent"

我对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
才会发生的bug。除非您试图创建的内容依赖于控制台日志记录,否则这应该不是问题。

这是一个实现难题。在控制台中展开对象时,Chrome(V8)和Firefox(SpiderMonkey)将解析为该对象。在幕后,这个值可能已经改变了。WebKit(Safari)将按原样记录。如果希望捕获对象在某个时间点的状态,请使用
console.log(JSON.parse(JSON.stringify(obj))

[1]


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

这是因为浏览器的控制台是如何工作的,它只在控制台中展开对象时解析对该对象的引用,就像@Titus所说的那样。我总是忘了这个。在将对象记录到控制台时,避免此类黑魔法的一个好方法是始终记录对象的JSON格式:
console.log('people:',JSON.stringify(people))
;谢谢你迅速而详细的答复:D