185

我在这里写了一个快速的 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 对象的深层副本,以便修改原始变量不会修改新变量?

4

2 回答 2

264

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

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

文档

于 2013-08-21T13:47:06.073 回答
118

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

请参阅此 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" };

注意 ifextraProp也是 oldObject 上的一个属性,它的值将不会被使用,因为extraProp : "abc"稍后会在表达式中指定,这实际上会覆盖它。当然,oldObject 不会被修改。

于 2013-08-21T13:44:51.337 回答