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

例:我想避免以下情况:

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

对象很可能包含复杂类型作为属性,所以简单的for(var x in obj1)解决不了问题。我需要自己写一个递归克隆吗?还是有一些我没有看到的内置的东西?


当前回答

你也可以使用这个克隆库来深度克隆对象。

 npm install --save clone
const clone = require('clone');

const clonedObject = clone(sourceObject);

其他回答

查看underscore.js。它具有克隆和扩展以及许多其他非常有用的功能。

这可能很有用:在Node.js中使用下划线模块

这段代码也是object .create()方法使用指定的原型对象和属性创建一个新对象的原因。

var obj1 = {x:5, y:5};

var obj2 = Object.create(obj1);

obj2.x; //5
obj2.x = 6;
obj2.x; //6

obj1.x; //5

你可以使用JQuery的extend函数:

var newClone= jQuery.extend({}, oldObject);  
var deepClone = jQuery.extend(true, {}, oldObject); 

还有一个Node.js插件:

https://github.com/shimondoodkin/nodejs-clone-extend

要做到没有JQuery或插件阅读这里:

http://my.opera.com/GreyWyvern/blog/show.dml/1725165

可能性1

低装饰深度复制:

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

可能性2(已弃用)

注意:这个解决方案现在在Node.js的文档中被标记为已弃用:

util._extend()方法从未打算在内部Node.js模块之外使用。社区发现并使用了它。 它已弃用,不应在新代码中使用。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;
};

我很惊讶,客体。还没有提到Assign。

let cloned = Object.assign({}, source);

如果可用(例如Babel),你可以使用对象展开操作符:

let cloned = { ... source };