面试必考知识点:深拷贝(包含一维深拷贝,二维是浅拷贝)

阅读: 评论:0

面试必考知识点:深拷贝(包含一维深拷贝,二维是浅拷贝)

面试必考知识点:深拷贝(包含一维深拷贝,二维是浅拷贝)

知识点:深拷贝

深浅拷贝:

浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。

仅仅是复制了引用,彼此之间的操作会互相影响
复制代码

深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

在堆中重新分配内存,不同的地址,相同的值,互不影响
复制代码

数组类常见方法

  • 方法一:Array.prototype.slice()函数(一维深拷贝,二维的是浅拷贝)
    let arr = ['memo', 'fire', 'bug'];let arrCopy = arr.slice(0);arrCopy[0] = 'rocket';console.log(arr);//["memo", "fire", "bug"]console.log(arrCopy);//["rocket", "fire", "bug"]
复制代码
  • 方法二:at()函数(一维深拷贝,二维的是浅拷贝)
    let arr = ['memo', 'fire', 'bug'];let arrCopy = at();arrCopy[0] = 'rocket';console.log(arr); // ["memo", "fire", "bug"]console.log(arrCopy); // ["rocket", "fire", "bug"]
复制代码

其实Array的slice和concat方法并不是真正的深拷贝, 对于Array的第一层的元素是深拷贝,而Array的第二层 slice和concat方法是复制引用。

let a = [[1, 2], 3, 4];
let b = a.concat();
console.log(a === b); // falsea[0][0] = 0;
console.log(a); // [[0, 2], 3, 4]
console.log(b); // [[0, 2], 3, 4]
复制代码

对象类常见方法

  • 方法一:JSON法 (完全的深拷贝)

JSON.parse(JSON.stringify(obj))

JSON.stringify():把一个js对象序列化为一个JSON字符串 JSON.parse():把JSON字符串反序列化为一个js对象

let a = {a:1,b:{cd:2,ef:3}};
let b = JSON.parse(JSON.stringify(a));
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":2,"ef":3}}
复制代码

PS: 不过 Json压缩不可靠,fn会被过滤

  • 方法二:ES6 assign大法

Object.assign({}, obj)(一维深拷贝,二维是浅拷贝)

let a = {a:1,b:{cd:2,ef:3}};
let b = Object.assign({},a);
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":22,"ef":3}}复制代码
  • 方法三:ES6 ...法(一维深拷贝,二维是浅拷贝)
let a = {a:1,b:{cd:2,ef:3}};
let b = {...a};
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":22,"ef":3}}
复制代码
每日笔耕打卡,系列文档精耕细作 欢迎mark,共同进步。 github地址

本文发布于:2024-02-02 13:49:57,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170685299844220.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:知识点   一维深
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23