Javascript 如何在JS中创建对象的可变和不可变副本

Javascript 如何在JS中创建对象的可变和不可变副本,javascript,Javascript,在不使用任何附加库的情况下,如何创建对象的不可变副本并保留可变副本 var mutableCopy = immutableData; Object.freeze(immutableData); mutableCopy.newProp = 'mutated!'; console.log(mutableCopy.hasOwnProperty('newProp')); // false 似乎Object.freeze()也通过引用冻结对象 如何创建对象的可变和不可变副本?这是一个按引用传递与按

在不使用任何附加库的情况下,如何创建对象的不可变副本并保留可变副本

var mutableCopy = immutableData;

Object.freeze(immutableData);

mutableCopy.newProp = 'mutated!';

console.log(mutableCopy.hasOwnProperty('newProp')); // false
似乎
Object.freeze()
也通过引用冻结对象


如何创建对象的可变和不可变副本?

这是一个按引用传递与按值传递的问题,您说得有点对。实际上,通过引用传递发生在第一行。
mutableCopy
immutableData
都指向JS堆上的同一个对象

您应该做的是创建一个新对象,它是旧对象的副本。然后,冻结新对象将保留旧对象作为可变副本,同时防止修改

var newObj = {}
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        newObj[key] = obj[key];
    }
}

Object.freeze(newObj);
当然,如果您选择的话,您可以将新对象设置为可变副本,将旧对象设置为不可变副本

var objCopy = {};

for ( var propKey in objToClone )
    objCopy[ propKey ] = objToClone[ propKey ];
和object.freeze,你喜欢哪个都行。如果你有一个更复杂/更深的对象,并且需要改变这些更深的属性,我可能会使用一些像

var objCopy = JSON.parse( JSON.stringify( objToClone ) );

这是一个嵌套很深的对象,还是属性只有一层深?嵌套了两层深,但我只想在第一层中变异属性,即使没有
对象。冻结
我可以在这里修改
newObj
的属性,
obj
的属性仍然不会改变,对吗?看起来我不需要使用
对象。冻结
你是对的。如果在复制后修改
obj
newObj
,则另一个不会更改。JSON.deserialize/serialize?你是说JSON.parse/stringify吗?我试过
var objCopy=Object.create(objToClone)
是我在另一个SO问题上发现的,它不适用于通过引用复制package.json文件,但是json字符串化然后解析是有效的。谢谢