1.概念:
浅拷贝 :浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。
深拷贝:深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。
2:栈与堆
栈:用来存储简单数据类型和对象的引用地址--number、string、boolean、null、undefind等
栈:用来存储复杂数据类型--Array、Object、date、RegExp等
3深拷贝案例:下面这段代码可以简单实现深拷贝但是存在弊端,但凡有复杂数据就必须要再次遍历
var obj1 = {
uname:'张三',
age:21,
scholl:{
name:'清华',
address:'北京'
},
hoppy:[
"打篮球","吃饭","睡觉","打豆豆"
]
}
var obj2 = {}
// 用for in 嵌套遍实现深拷贝
for(var k in obj1){
// 判断数据类型
if(obj1[k].constructor == Object){
// 创建空对象,遍历
obj2[k] = {}
for(var j in obj1[k]){
obj2[k][j] = obj1[k][j]
}
}else if(obj1[k].constructor == Array){
// 创建空数组,遍历
obj2[k] = []
for(var m in obj1[k]){
obj2[k][m] = obj1[k][m]
}
}else{
obj2[k] = obj1[k]
}
}
obj2.scholl.name = "北大"
obj2.hoppy[2] = "打游戏"
console.log(obj2,"obj2");
// 可以发现obj1中的数据并没有被修改
console.log(obj1,"obj1");
用递归实现深拷贝:
var obj1 = {
uname:'张三',
age:21,
scholl:{
name:'清华',
address:'北京'
},
hoppy:[
"打篮球","吃饭","睡觉","打豆豆"
]
}
var obj2 = {}
// 用递归实现深拷贝
function deepCopy(obj2,obj1){
for(var k in obj1){
// 判断数据类型
if(obj1[k].constructor == Object){
// 创建空对象,遍历
obj2[k] = {}
deepCopy(obj2[k],obj1[k])
}else if(obj1[k].constructor == Array){
// 创建空数组,遍历
obj2[k] = []
deepCopy(obj2[k],obj1[k])
}else{
obj2[k] = obj1[k]
}
}
}
deepCopy(obj2,obj1)
// 修改了obj2下的scholl的属性值
obj2.scholl.name = "qinghua"
console.log("obj2",obj2);//发现obj2对应的属性值变了
console.log("obj1",obj1); //obj1没有变
用 JSON.parse(JSON.stringify())可以实现暴力深拷贝
var obj3 = {
name:"赵六",
age:21,
height:170,
school:{
name:"北大",
addres:"北京"
}
}
var obj5 = JSON.parse(JSON.stringify(obj3))
obj5.school.name = "清华"
// 可以发现修改了obj5,不影响obj3
console.log("obj5",obj5);
console.log("obj3",obj3);
浅拷贝:Object.assign() 当然这里只列举了这一种方法,实现浅拷贝还有方法,这个最简单
var obj3 = {
name:"赵六",
age:21,
height:170,
school:{
name:"北大",
addres:"北京"
}
}
var result = Object.assign({},obj3)
result.school.name = "清华"
console.log(result);
// 发现obj3数据也变了
console.log(obj3);
4.闭包:一个函数能够访问另一个函数内部的变量这种查找方式我们就称之为闭包。(大概意思)
function cover(){
var num = 100
function inter(){
num = 10
return num
}
inter()
}
cover() //打开断点可以发现当执行到内层函数的时候产生了闭包