900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 对象深浅拷贝

对象深浅拷贝

时间:2023-05-18 02:22:45

相关推荐

对象深浅拷贝

1、Object.assign() 对象合并 (--浅拷贝)

var obj = {a:'111',b:'2222',c:{aa:11,bb:222,cc:222},}var obj2 = Object.assign(obj)obj.a = 999999console.log(obj2) // 同objconsole.log( obj.a) // 999999

Object.assign() 是浅拷贝 不是深拷贝

2、ES6 对象解构(浅拷贝)

var obj = {a:'111',b:'2222',c:{aa:11,bb:222,cc:222},}var obj2 = {...obj}obj.a = 999999obj.c.aa = 999999console.log(obj2) // 同objconsole.log( obj.a) // 999999console.log( obj2.a) // 111console.log( obj.c.aa) //999999console.log( obj2.c.aa) //999999

对象的解构赋值是浅拷贝 不能用于深拷贝

如果解构的是单层对象 则以引用地址不共用

3、for...in... 循环遍历对象(浅拷贝)

var obj = {name: "小明",age: 20}var obj1 = {}for (var key in obj) {//遍历属性值,深拷贝obj1[key] = obj[key]}console.log(obj1);

for...in... 循环拷贝也是浅拷贝

4、Object.freeze() 拷贝并冻结对象 (浅拷贝)

var obj = {a:'111',b:'2222',c:{aa:11,bb:222,cc:222},}var obj2 = Object.freeze(obj)obj.a = 999999obj2.a = 999999console.log(obj2) // 同objconsole.log( obj.a) // 111console.log( obj2.a) // 111

Object.freeze() 用于冻结对象,让其属性和值均不能更改

Object.freeze()若用于拷贝对象,还是浅拷贝

5、Object.create() 创建对象 (浅拷贝)

var obj = {a:'111',b:'2222',c:{aa:11,bb:222,cc:222},}var obj2 = Object.create(obj)obj.a = 333console.log(obj2) // 同objconsole.log( obj.a) // 333console.log( obj2.a) // 333

Object.create() 拷贝对象是浅拷贝

6、json暴力转化(--深拷贝)

var obj = {name:'123'}var obj2 = JSON.parse(JSON.stringify(obj)

JSON拷贝与局限性,当值为undefined、function、symbol时候,在转化过程中会被忽略

7、递归 (--深拷贝)

function deepClone(target) {// 如果是对象,且不是原始值nullif (typeof target === 'object' && target) {// 创建容器const result = Object.prototype.toString.call(obj) === '[object Object]' ? {} : []Object.keys(target).forEach(key => {result[key] = deepClone(target[key])})return result;}return target;}

8、缓存克隆(--深拷贝)

function deepClone(target,map = new Map()) {if (typeof target === 'object' && target) {const cache = map.get(target)if (cache) {return cache}const result = Object.prototype.toString.call(obj) === '[object Object]' ? {} : []map.set(target, result)Object.keys(target).forEach(key => {result[key] = deepClone(target[key],map)})return result;}return target;}

跟递归拷贝差不多 不一样的是这里面多了一个缓存 如果克隆过了 就不需要重复克隆了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。