克隆节点中的对象.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)无法解决。我需要自己编写递归克隆,还是内置了我没有看到的东西?
在 node 中克隆对象的最佳方法是什么.js
例如,我想避免以下情况:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
该对象可能包含复杂的类型作为属性,因此简单的for(obj1中的var x)无法解决。我需要自己编写递归克隆,还是内置了我没有看到的东西?
低调的装饰深度复制:
var obj2 = JSON.parse(JSON.stringify(obj1));
注意力:此解决方案现在在 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;
};
我很惊讶没有被提及。Object.assign
let cloned = Object.assign({}, source);
如果可用(例如 Babel),您可以使用对象展开运算符:
let cloned = { ... source };