浅拷贝和深拷贝

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展开全部层级

 

posted on 2020-08-05 12:00  橘生淮南_  阅读(150)  评论(0编辑  收藏  举报