在javascript中克隆一个对象

下面的第一个日志为0,然后是日志1.如何存储对象的副本,而不是对它的引用?

debug.log(vi.details.segment); vi.nextSegment = vi.details; vi.nextSegment.segment++; debug.log(vi.details.segment); 

在jQuery中克隆一个对象:

 var vi.nextSegment = jQuery.extend({}, vi.details); 

注:上面是一个浅拷贝:任何嵌套的对象或数组将被引用复制 – 意味着您对vi.nextSegment.obj[prop]所做的任何更改都将反映在vi.details.obj[prop] 。 如果你想要一个完全独立于原来的全新对象,你需要做一个深层次的拷贝(作为第一个parameter passingtrue ):

 var vi.nextSegment = jQuery.extend(true, {}, vi.details); 

阅读更多关于扩展,请看这里。

看看post: 什么是最有效的克隆一个javascript对象的方法

按照John Resig的回答:

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

更多的信息可以在jQuery文档中find。

这对我克隆使用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)); } }); 

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

格拉西亚斯!

克隆对象的另一种方法是

 newObj = JSON.parse(JSON.stringify(oldObj)); 

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

这是我多次复制元素的方式:

首先我有一个模板:

 <div class="forms-container"> <div class="form-template"> First Name <input> .. a lot of other data ... Last Name <input> <div> <button onclick="add_another();">Add another!</button> <div> 

现在,JavaScript:

 function add_another(){ jQuery(".form-template").clone().appendTo(".forms-container"); } 

尝试Immutable.js

由于jQuery主要处理DOM Elements ,因此它可能不是正确的工具。 Immutable.js是由Facebook创build的56 kb (minified)库。

 // roughly implementing import Immutable from 'immutable' // const oldObj = { foo: 'bar', bar: 'baz' } // create a map from the oldObj and then convert it to JS Object const newObj = Immutable.Map(oldObj).toJS() 

这样你就可以有效地从oldObj克隆oldObj 。 基本上,如果你还没有Map ,那么我们需要先创build一个Map 。 地图就像我们用来创buildcopiesblue-print

参考文献

首页 – 不变的

文档 – 不可变的文档

GitHub – 不可变@ GitHub

祝你好运。