如果克隆阵列,则使用cloneArr = arr.slice()
我想知道如何在nodejs中克隆对象。
发布于 2012-10-11 03:21:16
对于不需要压缩每一滴性能的实用程序和类,我经常作弊,只使用JSON执行深度复制:
function clone(a) {
return JSON.parse(JSON.stringify(a));
}
这不是唯一的答案,也不是最优雅的答案;所有其他答案都应该被考虑到生产瓶颈。然而,这是一个快速而肮脏的解决方案,非常有效,并且在大多数情况下都很有用,我需要克隆一个简单的属性散列。
发布于 2017-06-01 14:14:16
上面的答案中都没有提到Object.assign。
let cloned = Object.assign({}, source);
如果你在ES6上,你可以使用扩展运算符:
let cloned = { ... source };
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
发布于 2011-05-22 23:57:24
没有用于克隆对象的本机方法。下划线实现了_.clone
,这是一个浅层克隆。
_.clone = function(obj) {
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
它要么对其进行切片,要么对其进行扩展。
这是_.extend
// extend the obj (first parameter)
_.extend = function(obj) {
// for each other parameter
each(slice.call(arguments, 1), function(source) {
// loop through all properties of the other objects
for (var prop in source) {
// if the property is not undefined then add it to the object.
if (source[prop] !== void 0) obj[prop] = source[prop];
}
});
// return the object (first parameter)
return obj;
};
Extend简单地遍历所有项,并创建一个包含这些项的新对象。
如果需要,您可以推出自己的朴素实现
function clone(o) {
var ret = {};
Object.keys(o).forEach(function (val) {
ret[val] = o[val];
});
return ret;
}
有充分的理由避免深度克隆,因为闭包不能被克隆。
我个人曾问过一个关于deep cloning objects before
的问题,我得出的结论是,你就是不做它。
我的建议是对浅层克隆使用underscore
及其_.clone
方法
https://stackoverflow.com/questions/6089058
复制相似问题