下面的第一个日志为0,然后是日志1.如何存储对象的副本,而不是对它的引用?在javascript中克隆对象
debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
下面的第一个日志为0,然后是日志1.如何存储对象的副本,而不是对它的引用?在javascript中克隆对象
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]
。如果你想要一个完全新的对象,它是完全从原来分开的,你需要做一个深拷贝(通过true
作为第一个参数):
var vi.nextSegment = jQuery.extend(true, {}, vi.details);
要更多扩展阅读起来,看here.
看看帖子:
按What is the most efficient way to clone a javascript objectJohn Resig's答案:
// Shallow copy
var newObject = jQuery.extend({}, oldObject);
// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
更多信息,可以在jQuery documentation.
找到这个工作更好地为我克隆使用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是两个不同的对象,你不必搞乱“参考”的问题
Gracias!
我喜欢这个:0) – kiranvj 2015-05-11 20:06:55
你可以做到这一点没有jquery 使用JSON.parse内置方法 – MarkosyanArtur 2017-03-24 04:12:24
这是我的元素复制几次:
首先我有一个模板:
<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");
}
另一种方式来克隆对象
newObj = JSON.parse(JSON.stringify(oldObj));
但要小心,如果它包含日期。在这种情况下,JSON.parse将返回date.toString()而不是日期。
Immutable.js
:由于jQuery
主要涉及DOM Elements
,它可能不是这份工作的合适工具。 Immutable.js
是由Facebook
创建的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
克隆newObj
。基本上,如果您没有Map
,那么我们首先需要创建一个Map
。地图就像我们用来创建copies
的blue-print
。
首页 -Immutable
文档 -Immutable Docs
GitHub的 -[email protected]
好运。
这不是一个深层复制。 'var a = {b:[1,2]}; $ .extend({},a).b [0] ='test';'和'a.b [0]'将被更改为'test'。要进行深层复制,请将'true'作为第一个参数:'$ .extend(true,{},a);' – Reid 2011-03-19 20:25:22
我忘记了包含深层复制,我只是编辑了我的答案。 – 2011-03-19 20:26:31
刚刚得到我的一个gothcha:'jQuery.extend(true,{},obj);'会创建一个副本。 'jQuery.extend(true,obj,{});'不会。 – worldsayshi 2013-04-21 21:41:16