分析:
浅拷贝只是拷贝一层,深拷贝可拷贝多层
意思就是一个对象里面有普通数据和对象或者数组,现在要拷贝它
浅拷贝就是拷贝普通数据和数组对象的地址,因为地址指向的是同一个所以拷贝之后,修改数组或者对象的数据,拷贝和被拷贝的都会发生变化.
深拷贝是拷贝了一个对象的所有内容,但是它是独立的,指向不同的地址.
浅拷贝:
(1) 使用循环拷贝
(2)使用Object.assign()拷贝(es6中的)
var names = {
a: "javascript",
b: "HTML",
msg: {
c: "CSS"
}
}
var obj = {};
//1:简单的拷贝方法assign函数
Object.assign(obj,names)
//2:原生的方法
for (var key in names) {
//k 属性名 names[key]属性值 给obj添加属性
obj[key] = names[key]
}
(上面方法二选一)
console.log(obj)
//修改obj中的C 看指向同一地址的names改变不
obj.msg.c = "css3"
console.log(obj.msg.c, names.msg.c)
深拷贝
(1)代码少的可以使用JSON.stringify()实现
//深拷贝拷贝很多层,每一级别都会拷贝
var names = {
a: "javascript",
b: "HTML",
msg: {
c: "CSS"
},
do: ["H5", "css3"]
}
var obj = JSON.parse(JSON.stringify(obj));
console.log(obj)
//修改obj中的C 看指向同一地址的names改变不
obj.msg.c = "css3"
console.log(obj.msg.c, names.msg.c)//不同就是深克隆
(2)使用递归实现深克隆
//深拷贝拷贝很多层,每一级别都会拷贝
var names = {
a: "javascript",
b: "HTML",
msg: {
c: "CSS"
},
do: ["H5", "css3"]
}
var obj = {};
// 封装函数
function deepCopy(newsobj, oldobj) {
for (var k in oldobj) {
//判断属性属于那种属性
//获取属性
var item = oldobj[k];
// 判断这个值是否是数组
if (item instanceof Array) {
newsobj[k] = [];
deepCopy(newsobj[k], item)
} else if (item instanceof Object) {
//判断是对象
newsobj[k] = {};
deepCopy(newsobj[k], item)
} else {
//简单数据
newsobj[k] = item;
}
}
}
deepCopy(obj, names)
console.log(obj)
//修改obj中的C 看指向同一地址的names改变不
obj.msg.c = "css3"
console.log(obj.msg.c, names.msg.c)
记得点赞~啊
转载:https://blog.csdn.net/qq_43920865/article/details/106444687
查看评论