在 JavaScript 中克隆对象

Posted

技术标签:

【中文标题】在 JavaScript 中克隆对象【英文标题】:Cloning an object in JavaScript 【发布时间】:2011-07-18 21:22:03 【问题描述】:

下面先记录0,再记录1。如何存储对象的副本,而不是引用

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

【问题讨论】:

【参考方案1】:

在 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.

【讨论】:

这不是深拷贝。 var a = b: [1, 2]; $.extend(, a).b[0] = 'test';a.b[0] 将更改为 'test'。要进行深层复制,请将true 作为第一个参数:$.extend(true, , a); 一个刚刚得到我的 gothcha:jQuery.extend(true, , obj); 将创建一个副本。 jQuery.extend(true, obj, ); 不会。 @worldsayshi :我希望我能早点看到你的评论。几个星期以来一直为此头疼。非常感谢。 太棒了,伙计们!正是我需要的!【参考方案2】:

看帖子:What is the most efficient way to clone a javascript object

根据John Resig's 回答:

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

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

更多信息可以在jQuery documentation.找到

【讨论】:

【参考方案3】:

这对我使用 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 中克隆数据对象是两个不同的对象,你不必搞砸“按引用”的问题

感谢!

【讨论】:

你可以在不使用 jquery 的情况下使用 JSON.parse 内置方法【参考方案4】:

另一种克隆对象的方法是

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

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

【讨论】:

【参考方案5】:

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

首先我有一个模板:

<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");

【讨论】:

【参考方案6】:

试试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。地图就像一个blue-print,我们一起创建copies

参考资料:

首页 - Immutable

文档 - Immutable Docs

GitHub - Immutable@GitHub

祝你好运。

【讨论】:

【参考方案7】:

如果您需要保留初始对象但需要使用新选项覆盖数据,您可以将多个对象传递给 $.extend (jQuery),第一个选项为 true:

var opts_default = opt1: true, opt2: false;
var opts_new = opt1: false;
var opts_final = $.extend(true, , opts_default, opts_new);

【讨论】:

以上是关于在 JavaScript 中克隆对象的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中深度克隆对象的最有效方法是啥?

在 JavaScript 中深度克隆对象的最有效方法是啥?

在 JavaScript 中深度克隆对象的最有效方法是啥?

在 JavaScript 中克隆对象

javascript 在JS中克隆一个对象

26.JavaScript实现对象混合与对象浅度克隆和对象的深度克隆