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

Pru*_*rus 167 javascript object javascript-objects

在这里编写了一个快速的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
Run Code Online (Sandbox Code Playgroud)

有没有办法制作json对象的深层副本,以便修改原始变量不会修改新变量?

And*_*ndy 243

我发现如果您不使用jQuery并且只对克隆简单对象感兴趣,则以下内容有效(请参阅注释).

JSON.parse(JSON.stringify(json_original));
Run Code Online (Sandbox Code Playgroud)

  • 不适用于函数,仅适用于对象中的属性(变量). (17认同)
  • `JSON.stringify({key:undefined})// =>"{}"` (9认同)
  • 请注意,这不适用于具有循环引用的对象. (6认同)
  • 这样,日期将被字符串化,并且即使在解析之后也将保持字符串. (4认同)

Moe*_*eri 105

你唯一的选择是以某种方式克隆对象.

请参阅此stackoverflow问题,了解如何实现此目的.

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

var newObject = JSON.parse(JSON.stringify(oldObject));
Run Code Online (Sandbox Code Playgroud)

如果你使用jQuery,你可以使用:

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

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
Run Code Online (Sandbox Code Playgroud)

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

在ES6或TypeScript(2.1+)中:

var shallowCopy = { ...oldObject };

var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" };
Run Code Online (Sandbox Code Playgroud)

请注意,如果extraProp它也是oldObject上的属性,则不会使用其值,因为extraProp : "abc"稍后在表达式中指定了该值,这基本上会覆盖它.当然,不会修改oldObject.