在javascript中克隆一个对象

Mat*_*rym 65 javascript arrays jquery clone object

下面首先记录0,然后记录1.如何存储对象的副本,而不是对它的引用?

debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
Run Code Online (Sandbox Code Playgroud)

Mik*_*wis 132

要在jQuery中克隆一个对象:

var vi.nextSegment = jQuery.extend({}, vi.details);
Run Code Online (Sandbox Code Playgroud)

注意:以上是浅拷贝:任何嵌套对象或数组都将通过引用复制 - 这意味着您所做的任何更改vi.nextSegment.obj[prop]都将反映在其中vi.details.obj[prop].如果您想要一个完全独立于原始对象的全新对象,则需要进行深层复制(true作为第一个参数传递):

var vi.nextSegment = jQuery.extend(true, {}, vi.details);
Run Code Online (Sandbox Code Playgroud)

要阅读有关extend的更多信息,请参阅此处.

  • 这不是一个深刻的副本.`var a = {b:[1,2]}; $ .extend({},a).b [0] ='test';`和`ab [0]`将被改为''test'.要做一个深层复制,把`true`作为第一个参数:`$ .extend(true,{},a);` (11认同)
  • 刚给我的一个gothcha:`jQuery.extend(true,{},obj);`将创建一个副本.`jQuery.extend(true,obj,{});`不会. (5认同)

Sco*_*ler 32

看一下帖子:克隆javascript对象最有效的方法是什么

根据John Resig的回答:

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

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

可以在jQuery文档中找到更多信息.


Mec*_*ito 8

这对我使用jQuery"parseJSON()"和"JSON.stringify()"克隆对象更有效.

$.ajax({
  url: 'ajax/test.html',
  dataType: 'json',
  success: function(data) {
    var objY = $.parseJSON(JSON.stringify(data));
    var objX = $.parseJSON(JSON.stringify(data));
  }
});
Run Code Online (Sandbox Code Playgroud)

在objX&objY中克隆数据对象是两个不同的对象,你不必搞乱"引用"问题

格拉西亚斯!


Mar*_*tur 6

克隆对象的另一种方法是

newObj = JSON.parse(JSON.stringify(oldObj));
Run Code Online (Sandbox Code Playgroud)

但如果它包含日期,请小心.在这种情况下,JSON.parse将返回date.toString()而不是date.