在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
。 地图就像我们用来创buildcopies
的blue-print
。
参考文献
首页 – 不变的
文档 – 不可变的文档
GitHub – 不可变@ GitHub
祝你好运。