最近在项目开发时遇得到了好多关于对象复制的问题,对于对象的深度复制与浅度复制貌似有很多实现方法。这些方法里有js原生封装的,有第三方库提供的,有点混乱了,所以关于这个问题有必要整理一下了。
import cloneDeep from 'lodash/cloneDeep';
Lodash 一套工具库,它内部封装了诸多对字符串、数组、对象等常见数据类型的处理函数,其中部分是目前 ECMAScript 尚未制定的规范,但同时被业界所认可的辅助函数。目前每天使用 npm 安装 Lodash 的数量在百万级以上,这在一定程度上证明了其代码的健壮性,值得我们在项目中一试。
var objA = {
"name": "colin"
}
// Normal method? Too long. See Stackoverflow for solution:
// http://stackoverflow.com/questions/4459928/how-to-deep-clone-in-javascript
// Lodash
var objB = _.cloneDeep(objA);
objB === objA // false |
JavaScript 没有直接提供深拷贝的函数,但我们可以用其他函数来模拟,但这种方法要求对象中的属性值不能是函数。Lodash 中的 _.cloneDeep 函数封装了深拷贝的逻辑,用起来更加简洁。
参考:http://lodash.think2011.net/;http://www.jianshu.com/p/5809db81281c
实践
const handleClone = () => {
const cloneDeep = (obj) => {
let objCloned;
if(Array.isArray(obj)) {
objCloned = [];
for(let i = 0; i< obj.length; i++) {
objCloned[i] = cloneDeep(obj[i]);
}
} else if(typeof obj === 'object' && obj !== null) {
objCloned = {};
Object.getOwnPropertyNames(obj).map(item =>
objCloned[item] = cloneDeep(obj[item]));
}
return obj;
};
const objInner = {
nameInner: 'panInner',
getNameInner: () => console.log(this.name),
};
|
