我不明白为什么以下代码会产生不同的输出:

第一种算法:

var data = {
    l1: 1,
    l2: 2,
    l3: 3
};
var datas = [];
for (var i = 0; i < 3; i++) {
    datas[i] = {}
    for (key in data) {
        datas[i][key] = data[key]
    }
};
delete datas[0].l1
delete datas[1].l2
delete datas[2].l3
console.log(data)
console.log("%j", datas)


输出:

{ l1: 1, l2: 2, l3: 3 }
[{"l2":2,"l3":3},{"l1":1,"l3":3},{"l1":1,"l2":2}]


第二种算法:

var data = {
    l1: 1,
    l2: 2,
    l3: 3
};
var datas = [];
for (var i = 0; i < 3; i++) {
    datas[i] = {}
    datas[i] = data ;
};
delete datas[0].l1
delete datas[1].l2
delete datas[2].l3
console.log(data)
console.log("%j", datas)


输出:

{}
[{},{},{}]

最佳答案

从第二个块/算法的下面一行:

datas[i]=data


您只是在定义对同一对象data的另一个引用(而不是新对象)。因此,从此data对象删除所有属性后,这些引用将反映该更改。

关于javascript - 代码重构后对象为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35043893/

10-12 00:05
查看更多