【问题标题】:Why does console log, log out a variable thats already been assigned as the new assignment [duplicate]为什么控制台日志,注销已经分配为新分配的变量[重复]
【发布时间】:2019-05-16 12:19:38
【问题描述】:

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

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

【问题讨论】:

  • 那是因为浏览器的控制台是如何工作的,它只有在您在控制台中展开该对象时才解析对该对象的引用。
  • 就像@Titus 说的那样。我总是忘记这一点。在将对象记录到控制台时,避免这种黑魔法的一个好方法是始终记录对象的 JSON 格式:console.log('people:', JSON.stringify(people));

标签: javascript ecmascript-6 console.log


【解决方案1】:

这是一个实现的怪癖。 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 中的异步编程非常相似,这可能会令那些来自程序背景的人感到震惊。简单来说,你的值会在你到达下一行之前在幕后发生变化,因此了解事件循环、回调以及随后的 promises 和 async/await 是一个好主意。

【讨论】:

  • 感谢您快速详细的回复:D
【解决方案2】:

请看这个问题:console.log() shows the changed value of a variable before the value actually changes。这是一个发生在console.log 的错误。除非您依赖控制台日志记录您尝试创建的内容,否则这应该不是问题。

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多