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

如何不通过引用将JavaScript对象复制到新变量?,javascript,object,javascript-objects,Javascript,Object,Javascript Objects,我编写了一个快速JSFIDLE,将一个小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

我编写了一个快速JSFIDLE,将一个小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对象的深度副本,这样修改原始变量就不会修改新变量?

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

看看你是如何做到这一点的

对于简单的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+)中:


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

我发现,如果您不使用jQuery,只对克隆简单对象感兴趣,那么下面的方法很有效(请参见注释)

文档


那里没有JSON。请不要将JavaScript对象与JSON混淆。@Quentin,谢谢,我会详细了解JavaScript对象与JSON之间的区别(参考:)不要认为这是重复的,答案在另一个线程上找不到。@Quentin,所以如果我们纯粹在JavaScript范围内讨论,JSON和JavaScript对象是等价的?JSON的不同之处在于它适用于用于解释它的语言?在JavaScript的范围内,JSON要么是“一种数据格式”,要么是“一种包含将JavaScript对象转换成该数据格式的字符串表示形式的方法的对象”,不适用于函数,而只适用于对象内的属性(变量)。
JSON.stringify({key:undefined})/=>“{}”
使用此选项,日期将被字符串化,即使在解析后仍将保持字符串。请注意,这对具有循环引用的对象不起作用。这就是为什么我的答案是简单对象,但我想这可能更清楚。我更喜欢此答案,因为“在ES6或TypeScript(2.1+):JQuery深层/浅层复制的例子也不错。我认为这应该是答案。
var shallowCopy = { ...oldObject };

var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" };
JSON.parse(JSON.stringify(json_original));