1.浅拷贝
// 只能实现第一层的拷贝
var obj1 = Object.asign({}, obj)
// 或者使用结构运算符
obj1 = { ...obj }
2.深拷贝
2.1 JSON转译
// 该方法不能拷贝undefined和函数,会忽略symbol
1 let target = JSON.parse(JSON.stringfy(source))
2.2 递归实现
// 递归实现,创建一个新的空对象target,遍历源对象的key,如果该key对应的属性值不是对象,就添加改属性到target,如果是对象就继续copy函数,最后返回target
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展开全部层级