js循环和对象数组的问题

mat*_*teo 1 javascript arrays foreach loops object

我有一个关于 js 循环及其实际工作原理的问题。我正在循环访问如下所示的对象数组:

const array = [{value: 0}, {value: 0}, {value: 0}, {value: 0}];
Run Code Online (Sandbox Code Playgroud)

循环只是更新每个元素的值:

array.forEach(el => {
        el.value = 1;
        console.log(array)
})
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么输出看起来像这样:

[{value: 1}, {value: 1}, {value: 1}, {value: 1}]
[{value: 1}, {value: 1}, {value: 1}, {value: 1}]
[{value: 1}, {value: 1}, {value: 1}, {value: 1}]
[{value: 1}, {value: 1}, {value: 1}, {value: 1}]
Run Code Online (Sandbox Code Playgroud)

而不是这样的:

[{value: 1}, {value: 0}, {value: 0}, {value: 0}]
[{value: 1}, {value: 1}, {value: 0}, {value: 0}]
[{value: 1}, {value: 1}, {value: 1}, {value: 0}]
[{value: 1}, {value: 1}, {value: 1}, {value: 1}]
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

gil*_*ran 5

我猜您正在尝试查看 Chrome 上开发工具的输出,并且在开发工具上,您会看到对数组的引用。这意味着在执行结束时,所有项目的值都为 1,因此开发工具会显示对数组的相同引用。

要查看执行时的实际值(而不是参考值),请使用JSON.stringify以下命令:

const array = [{value: 0}, {value: 0}, {value: 0}, {value: 0}];

array.forEach(el => {
        el.value = 1;
        console.log(JSON.stringify(array))
});
Run Code Online (Sandbox Code Playgroud)