克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
我有一个对象,x.我想把它复制为对象y,这样改变y就不要修改了x.我意识到复制从内置JavaScript对象派生的对象将导致额外的,不需要的属性.这不是问题,因为我正在复制我自己的一个文字构造的对象.
如何正确克隆JavaScript对象?
无论Object.assign和对象传播只能做一浅合并.
问题的一个例子:
// No object nesting
const x = { a: 1 }
const y = { b: 1 }
const z = { ...x, ...y } // { a: 1, b: 1 }
Run Code Online (Sandbox Code Playgroud)
输出是你所期望的.但是如果我试试这个:
// Object nesting
const x = { a: { a: 1 } }
const y = { a: { b: 1 } }
const z = { ...x, ...y } // { a: { b: 1 } }
Run Code Online (Sandbox Code Playgroud)
代替
{ a: …Run Code Online (Sandbox Code Playgroud) 我正在创建一个用户可以设计自己的表单的应用程序.例如,指定字段的名称以及应包含哪些其他列的详细信息.
该组件在此处作为JSFiddle提供.
我的初始状态如下:
var DynamicForm = React.createClass({
getInitialState: function() {
var items = {};
items[1] = { name: 'field 1', populate_at: 'web_start',
same_as: 'customer_name',
autocomplete_from: 'customer_name', title: '' };
items[2] = { name: 'field 2', populate_at: 'web_end',
same_as: 'user_name',
autocomplete_from: 'user_name', title: '' };
return { items };
},
render: function() {
var _this = this;
return (
<div>
{ Object.keys(this.state.items).map(function (key) {
var item = _this.state.items[key];
return (
<div>
<PopulateAtCheckboxes this={this}
checked={item.populate_at} id={key}
populate_at={data.populate_at} />
</div>
); …Run Code Online (Sandbox Code Playgroud) 你如何深度克隆Javascript对象?
我知道基于类似的框架有各种各样的功能JSON.parse(JSON.stringify(o)),$.extend(true, {}, o)但我不想使用这样的框架.
什么是创建深度克隆的最优雅或最有效的方法.
我们关心像克隆数组这样的边缘情况.不打破原型链,处理自我引用.
我们不关心支持复制DOM对象,因为因为.cloneNode这个原因而存在.
由于我主要想使用深度克隆来node.js使用V5引擎的ES5功能是可以接受的.
[编辑]
在任何人建议让我提及之前,通过原型继承对象并克隆它来创建副本之间存在明显差异.前者使原型链变得混乱.
[进一步编辑]
在阅读完答案后,我发现了一个令人讨厌的发现,即克隆整个物体是一个非常危险和困难的游戏.以下面的基于闭包的对象为例
var o = (function() {
var magic = 42;
var magicContainer = function() {
this.get = function() { return magic; };
this.set = function(i) { magic = i; };
}
return new magicContainer;
}());
var n = clone(o); // how to implement clone to support closures
Run Code Online (Sandbox Code Playgroud)
有没有办法编写克隆对象的克隆函数,在克隆时具有相同的状态,但是如果不在oJS中编写JS解析器,则无法改变状态.
这样的功能不再需要现实世界.这仅仅是学术兴趣.