为什么 console.log 甚至在修改之前就输出修改后的值?

Why does console.log output modified values even before they have been modified?

在Chrome39开发者工具中,这段代码:

var something = [
    {x: 'foo'},
    {x: 'foo'}
];

console.log(something);

something.forEach(function (element) {
    element['x'] = 'baz';
});

...输出:

为什么 console.log 甚至在修改之前就输出修改后的值?

类似question from 2012 explains that due to a chromium bugconsole.log的是"delayed"(不立即将输入对象字符串化)。但是这个错误被标记为已修复,为什么几年后仍然出现这种情况?

每当您单击对象数组时,它都会向您显示更新后的对象,而不是您执行 console.log 时对象外观的快照。

将其视为对相应对象的引用数组。

没有。

console.log输出对象时,输出"by reference"对象;控制台中的值是动态的,它们会更新以反映对象的当前状态。

如果要输出有关对象的静态文本字符串,请使用console.dir