我写了一个快速的jsfiddle here,我将一个小JSON对象传递给一个新变量并修改原始变量(而不是新变量)中的数据,但新变量的数据得到了也更新了。这必须意味着JSON对象是通过引用传递的,对吗?
这是我的快速代码:
var json_original = {one:'one', two:'two'}
var json_new = json_original;
console.log(json_original); //one, two
console.log(json_new); //one, two
json_original.one = 'two';
json_original.two = 'one';
console.log(json_original); //two, one
console.log(json_new); //two, one
有没有办法制作JSON对象的深层副本,以便修改原始变量不会修改新变量?
答案 0 :(得分:230)
如果您不使用jQuery并且只对克隆简单对象感兴趣(请参阅注释),我发现以下情况有效。
JSON.parse(JSON.stringify(json_original));
答案 1 :(得分:102)
您唯一的选择是以某种方式克隆对象。
请参阅this stackoverflow question了解如何实现这一目标。
对于简单的JSON对象,最简单的方法是:
var newObject = JSON.parse(JSON.stringify(oldObject));
如果你使用jQuery,你可以使用:
// Shallow copy
var newObject = jQuery.extend({}, oldObject);
// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
更新2017:我应该提一下,因为这是一个受欢迎的答案,现在有更好的方法来使用更新版本的javascript实现这一目标:
在ES6或TypeScript(2.1 +)中:
var shallowCopy = { ...oldObject };
var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" };
请注意,如果extraProp
也是oldObject的属性,则不会使用其值,因为稍后在表达式中指定了extraProp : "abc"
,这基本上会覆盖它。当然,不会修改oldObject。