传址
复杂的数据类型–传址: 传递了数值和地址,共享了一块内存空间
传址的两种方式:
- 浅拷贝
- 深拷贝
浅拷贝: 只拷贝数值,没有拷贝地址。 节省内存,但是因为共享内存,所以相互影响数据
let DadPro = {
name:"张三",
age:"20",
sex:"男"
}
let SonPro = DadPro;
SonPro.name = "李四";
console.log(SonPro);
console.log(DadPro);
深拷贝: 数值和内存都拷贝,相互独立,不彼此影响
let DadPro = {
name:"张三",
age:"20",
sex:"男",
obj2:{
score:"99",
hobby:"跳舞"
},
arr:[],
fn:function(){
console.log("dada");
},
txt:undefined
}
//JSON.parse(): 这个方法会返回一个新的对象, 以此来达成创建一个
//新地址的目的
//但是通过这个方法完成的深拷贝, 会丢失function(){} 和 undefined
let SonPro = JSON.parse(JSON.stringify(DadPro));
SonPro.name = "王五";
console.log(SonPro);
console.log(DadPro);
let arr = [];
console.log(typeof arr);
使用封装的深拷贝方法: deepCopy()
//引入
<script src="3-deepCopy.js"></script>
//后续的使用
let SonPro = deepCopy(DadPro);
SonPro.name = "李四";
console.log(SonPro);
console.log(DadPro);
deepCopy()
function deepCopy(obj){
let newObj = Array.isArray(obj)?[]:{};
//for-in: 会遍历对象和原型以及原型链上的属性和方法
//但是我们做深拷贝的时候,不需要去拷贝原型链的内容
for(let key in obj){
//hasOwnProperty(): 用来检测指定的内容是否是自身,返回布尔值
if(obj.hasOwnProperty(key)){
//判断是否是对象(复杂数据类型)
if(typeof obj[key] === "object"){
//如果内部的数据,依然是个对象
//再调用自身,重复检测赋值一遍
newObj[key] = deepCopy(obj[key]);
}else{ //简单的数据类型
newObj[key] = obj[key];
}
}
}
//最后,将我们检测并赋值的新对象返回! 达成新内存的目的
return newObj;
}
传值
简单的数据类型–传值: 传递数值,新开辟内存
let a = 10;
let b = a;
b = 20;
console.log(a); //10
console.log(b); //20
来源:CSDN
作者:CS_DGD
链接:https://blog.csdn.net/CS_DGD/article/details/104185410