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

Sha*_*ark 5 javascript ecmascript-6 console.log

我对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);
Run Code Online (Sandbox Code Playgroud)

两个结果都显示bob,而不是Roger,然后是Bob。

如果有人可以解释为什么会发生,那就太好了。

suv*_*suv 3

这是一个实施怪癖。当您在控制台中展开对象时,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 中的异步编程非常相似,这可能会让那些来自程序背景的人感到不舒服。简而言之,在到达下一行之前,您的值将在幕后发生变化,因此最好了解事件循环、回调以及随后的承诺和异步/等待。