克隆节点中的对象.js

2022-08-30 00:50:10

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

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

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

该对象可能包含复杂的类型作为属性,因此简单的for(obj1中的var x)无法解决。我需要自己编写递归克隆,还是内置了我没有看到的东西?


答案 1

可能性 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函数的源代码在这里:https://github.com/joyent/node/blob/master/lib/util.js_extend

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;
};

答案 2

我很惊讶没有被提及。Object.assign

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

如果可用(例如 Babel),您可以使用对象展开运算符

let cloned = { ... source };