js浅拷贝和深拷贝
1 for in 循环
const obj = {
name: '演员',
age: 18,
sex: '男'
}
for (const key in obj) {
console.log('键:' + key, '值:' + obj[key]);
}
输出结果:
2 递归
函数自己调用自己,就叫递归函数 ,并且还需要有个出口,如果没有就是死归。
function sum(num) {
if (num == 1) return 1
return num + sum(num - 1)
}
console.log(sum(5));//15
3 浅拷贝
浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
(1)展开运算符实现浅拷贝
const obj = {
a: 1,
b: 2,
c: {
ca: 3
}
}
//把对象obj展开 放在一个新对象newobj里面
const newobj = { ...obj }
// 此时我们改变newobj中的a属性的值 和c对象下ca属性的值
newobj.a = 2
newobj.c.ca = 5
console.log(obj, newobj);
输出结果中改变newobj.a的值 并没有引起obj中a的值变化
而改newobj.c.ca下的属性 obj.c.ca也发生了变化
说明完成了浅拷贝
(2) Object.assign(newObj, obj)方法实现浅拷贝
语法: Object.assign(新对象, 拷贝的对象)
const obj = {
a: 1,
b: 2,
c: {
ca: 3
}
}
let newobj = {}
Object.assign(newobj, obj);
// 此时我们改变newobj中的a属性的值 和c对象下ca属性的值
newobj.a = 2
newobj.c.ca = 5
console.log(obj, newobj);
4 深拷贝
深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
(1)JSON实现深拷贝
JSON.stringify()方法将js对象转换为json字符串。
JSON.parse()方法 将json字符串转换为js对象。
const obj = {
a: 1,
b: 2,
c: {
ca: 3
}
}
// 转换为json字符串
let jsonstr = JSON.stringify(obj)
console.log(jsonstr);//{"a":1,"b":2,"c":{"ca":3}}
//转换为js对象
let newobj = JSON.parse(jsonstr)
console.log(newobj);
// 写在一行就是 let newobj = JSON.parse(JSON.stringify(obj))
// 此时我们改变newobj中的a属性的值 和c对象下ca属性的值
newobj.a = 2
newobj.c.ca = 5
console.log(obj, newobj);
输出结果中改变newobj.a的值和newobj.c.ca下的属性 obj.c.ca的值 都没有引起obj中属性的值变化 说明完成了深拷贝
(2)递归实现
let obj = {
a: 1,
b: {
c: 2,
},
};
function deepClone(obj) {
if(!typeof obj == 'object') return '传入的不是引用类型'
let newClone = Array.isArray(obj)? [] : { }
for (const key in obj) {
newClone[key] = typeof obj[key] == 'object'? deepClone(obj[key]) : obj[key]
}
return newClone
}
const dep = deepClone(obj)
dep.a = 2
dep.b.c = 3
console.log(dep,obj);
(3)第三方库实现
此处不多讲了 直接看官网
lo大师库链接: lo大师库链接