淺拷貝和深拷貝
阿新 • • 發佈:2020-08-05
1.淺拷貝
// 只能實現第一層的拷貝 var obj1 = Object.asign({}, obj) // 或者使用結構運算子 obj1 = { ...obj }2.深拷貝
// 遞迴實現,如果是物件就繼續copy1 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展開全部層級