一尘不染

在Node.js中克隆对象

node.js

在node.js中克隆对象的最佳方法是什么

例如,我想避免以下情况:

var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6

该对象很可能包含复杂的类型作为属性,因此简单的for(var1 in obj1)无法解决。我需要自己编写一个递归克隆吗,还是内置了一些我看不到的东西?


阅读 265

收藏
2020-07-07

共1个答案

一尘不染

可能性1

简洁的深层副本:

var obj2 = JSON.parse(JSON.stringify(obj1));

可能性2(已弃用)

注意:
现在,Node.js文档中将该解决方案标记为不推荐使用:

从未打算在内部Node.js模块之外使用util._extend()方法。社区仍然找到并使用了它。

它已被弃用,不应在新代码中使用。JavaScript通过Object.assign()具有非常相似的内置功能。

原始答案

对于浅表副本,请使用Node的内置util._extend()功能。

var extend = require('util')._extend;

var obj1 = {x: 5, y:5};
var obj2 = extend({}, obj1);
obj2.x = 6;
console.log(obj1.x); // still logs 5

Node
_extend函数的源代码在这里:https
:
//github.com/joyent/node/blob/master/lib/util.js

exports._extend = function(origin, add) {
  // Don't do anything if add isn't an object
  if (!add || typeof add !== 'object') return origin;

  var keys = Object.keys(add);
  var i = keys.length;
  while (i--) {
    origin[keys[i]] = add[keys[i]];
  }
  return origin;
};
2020-07-07