如何通过引用将 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 对象进行深度拷贝,这样修改原始变量就不会修改新变量了?

202574 次浏览

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

关于如何实现这一点,请参阅 这个堆栈溢出的问题

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

我发现,如果您不使用 jQuery 并且只对克隆 简单的东西感兴趣,那么以下方法可以奏效(请参阅注释)。

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

文件