如何在javascript中实现深度克隆如何深入克隆Javascript对象?我知道有各种基于框架的函数,比如JSON.parse(JSON.stringify(o))和$.extend(true, {}, o)但我不想用这样的框架。什么是创建深度克隆的最优雅或最有效的方法。我们确实关心像克隆数组这样的边缘情况,而不是破坏原型链,处理自引用。我们不关心支持DOM对象的复制,而是因为.cloneNode就是因为这个原因。因为我主要想在node.js使用ES5功能的V8引擎是可以接受的。[编辑]在任何人建议之前,让我提一提,通过从对象继承原型来创建副本和克隆它。前者使原型链变得一团糟。[进一步编辑]在阅读了你的答案后,我发现克隆整个物体是一个非常危险和困难的游戏,这是一个令人讨厌的发现。例如,下面基于闭包的对象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是否有任何方法来编写克隆函数,克隆对象在克隆时具有相同的状态,但不能更改o而不用JS编写JS解析器。这样的功能不应该再存在于现实世界了。这只是学术上的兴趣。
3 回答
胡说叔叔
TA贡献1804条经验 获得超8个赞
这个 JSON.parse(JSON.stringify())
合并到深度复制Javascript对象是一种无效的攻击,因为JSON不支持 undefined
和 function () {}
,因此 JSON.stringify
当将Javascript对象“编组”到JSON时,将忽略代码的这些部分。
function copy(aObject) { if (!aObject) { return aObject; } let v; let bObject = Array.isArray(aObject) ? [] : {}; for (const k in aObject) { v = aObject[k]; bObject[k] = (typeof v === "object") ? copy(v) : v; } return bObject;}
添加回答
举报
0/150
提交
取消