var dd = [];
const ff = { };
ff.dd = 0;
dd.push(ff);
console.log(dd);
ff.dd = 1;
dd.push(ff);
console.log(dd);
我正在输出
[ { dd: 0 } ]
[ { dd: 1 }, { dd: 1 } ]
但我希望输出像
[ { dd: 0 } ]
[ { dd: 0 }, { dd: 1 } ]
要获得该输出,您必须创建一个新对象(ff
),而不是修改现有对象。
var dd = [];
let ff = { }; // <== `let` instead of `const`
ff.dd = 0;
dd.push(ff);
console.log(dd);
ff = { }; // <== Create a new object
ff.dd = 1;
dd.push(ff);
console.log(dd);
旁注:你根本不需要ff
:
var dd = [];
dd.push({dd: 0});
dd.push({dd: 1});
console.log(dd);
......事实上,整个过程可以在一个初始化器中完成:
var dd = [
{dd: 0},
{dd: 1}
];
console.log(dd);
Javascript保持对对象的引用。在你的代码中,你最初推动ff
变量并将dd
设置为0.然后你修改相同dd
变量的ff
值并将另一个引用推送到数组中。这就是为什么你得到一个数组,其中2个引用相同的ff
对象,dd
值为1。
如果要实现所写的结果,则需要先创建一个新对象,然后再将其推入数组。
如果你的ff
总是一层深,你可以使用Object.assign
克隆ff
每次你把它放入数组。
var ffCopy = Object.assign({}, ff);
var dd = [];
const ff = { };
ff.dd = 0;
dd.push(Object.assign({}, ff));
console.log(dd);
ff.dd = 1;
dd.push(Object.assign({}, ff));
console.log(dd);