1. 程式人生 > 實用技巧 >淺拷貝和深拷貝

淺拷貝和深拷貝

1.淺拷貝

// 只能實現第一層的拷貝 var obj1 = Object.asign({}, obj) // 或者使用結構運算子 obj1 = { ...obj }

2.深拷貝

// 遞迴實現,如果是物件就繼續copy
 1 function deepCopy(source){
 2   let target = {}
 3   for (const key in source) {
 4     const element = source[key];
 5     if(source.hasOwnProperty(key)){
 6       if (typeof element !== 'object') {
7 target[key] = element 8 } else { 9 target[key] = deepCopy(element) 10 } 11 } 12 } 13 return target 14 }

陣列展平的方法:

1.先將陣列轉為string(此時已將陣列展開,逗號分隔),再用split轉為陣列

 1 let a = [1,2,3]
 2 console.info(a.toString()) // "1,2,3"
 3 a = [1, 2, [3, 4]]
 4 console.info(a.toString()) //
"1,2,3,4" 5 a = [1, 2, [3, 4, [5, 6], 7], 8] 6 console.info(a.toString()) // "1,2,3,4,5,6,7,8" 7 let b = a.toString().split(",") 8 console.info(b) // ["1", "2", "3", "4", "5", "6", "7", "8"] 9 a = [1, 2, "a", [3, 4, [5, 'c', 6], 7], 8, {}, function(){}] 10 b = a.toString().split(",").map(item => Number.isNaN(Number(item)) ? item : Number(item))
11 console.info(b) // [ 1, 2, 'a', 3, 4, 5, 'c', 6, 7, 8 ]

以上只能對原始值有效,也算是一種思路。

2.ES6新增了 flat(n) -- 將巢狀陣列展開,n引數為展開層數,可用Infinity展開全部層級