最近在項目開發時遇得到了好多關於對象復制的問題,對於對象的深度復制與淺度復制貌似有很多實現方法。這些方法里有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),
};
|
