如何通过引用将JavaScript对象复制到新变量NOT



我在这里写了一个快速的jsfiddle,将一个小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对象进行深度复制,这样修改原始变量就不会修改新变量?

Edit:这个答案是在2014年做出的,现在有更好的方法来深度克隆对象。


我发现,如果您不使用jQuery,而只对克隆简单对象感兴趣,则以下方法有效(请参阅注释)。

JSON.parse(JSON.stringify(json_original));

文档

  • JSON.parse()
  • JSON.stringify()

您唯一的选择就是以某种方式克隆对象。

看看这个关于如何实现这一点的stackoverflow问题。

对于简单的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不会被修改。

最新更新