如何将javascript对象复制到新变量而不是通过引用?

How to copy JavaScript object to new variable NOT by reference?

本问题已经有最佳答案,请猛点这里访问。

我在这里编写了一个快速的JSfiddle,在这里我将一个小的JSON对象传递给一个新变量,并修改原始变量(不是新变量)中的数据,但是新变量的数据也会得到更新。这一定意味着JSON对象是通过引用传递的,对吧?

这是我的快捷代码:

1
2
3
4
5
6
7
8
9
10
11
12
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对象进行深度复制,这样修改原始变量就不会修改新变量?


我发现,如果您不使用jquery,并且只对克隆简单对象感兴趣,那么下面的内容可以工作(请参见注释)。

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


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

请参阅这个stackoverflow问题,了解如何实现这一点。

对于简单的JSON对象,最简单的方法是:

1
var newObject = JSON.parse(JSON.stringify(oldObject));

如果使用jquery,则可以使用:

1
2
3
4
5
// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

更新2017:我应该提到,因为这是一个很流行的答案,现在有更好的方法来使用新版本的javascript实现这一点:

在es6或typescript(2.1+)中:

1
2
3
var shallowCopy = { ...oldObject };

var shallowCopyWithExtraProp = { ...oldObject, extraProp:"abc" };

注意,如果extraProp也是oldobject的一个属性,则不会使用它的值,因为extraProp :"abc"在表达式后面被指定,这实际上会覆盖它。当然,OldObject不会被修改。