什么是赋值?
概念:当我们把一个对象赋值给一个新变量的时候,赋的其实是该对象在栈中的地址,而不是堆中的数据 ,也就是俩个对象使用的是同一个存储空间,所以当其中的任何一个数据发生改变的时候另一个也会随之改变 。
// An highlighted block
let person = {
name: "小明",
favorite: ['学习',['打篮球' ,'踢足球' ,'打羽毛'],'shopping']
};
let person1 = person;
person1.name = '小李';
person1.favorite[0] = '打游戏';
console.log(person1);
console.log(person);
小结:基本数据类型和引用数据类型都会发生变化,相互影响。
什么是浅拷贝?
概念:重新在堆中创建内存,拷贝后的对象基本数据类型互不影响,引用数据类型在同一个存储空间 还是会互相影响。
// An highlighted block
let person = {
name: "小明",
favorite: ['学习',['打篮球' ,'踢足球' ,'打羽毛'],'shopping']
};
function shallowCopy(person){
let target = {};
for(let i in person){
// i 是 key值 而 peison[i] 是value值
if(person.hasOwnProperty(i)){
// hasOwnProperty(i) 检测person中是否含有 i 属性 返回的是布尔值
target[i] = person[i]
}
}
return target;
}
let person1 = shallowCopy(person);
person1.name = '小李'
person.favorite[0] = '打游戏';
console.log(person1);
console.log(person);
小结:基本数据类型互不影响,引用数据类型相互影响。
什么是深拷贝?
概念:在堆中重新开辟一个新的区域来存储对象,新对象和原对象互不影响。
// An highlighted block
let person = {
name: "小明",
favorite: ['学习',['打篮球' ,'踢足球' ,'打羽毛'],'shopping']
};
function deepCopy(person){
/*
* 判断如果不等于对象 或者是数组(也是对象 万物皆对象)的时候 将这个值 赋值给他target 进行一下轮的循环
* 直到最后都成为基本数据类型
*/
let target ={};
if(typeof person !== 'object') return person;
for(let i in person){
if(person.hasOwnProperty(i)){
// 利用递归进行深考贝
target[i] = deepCopy(person[i]);
}
}
return target;
}
let person1 = deepCopy(person);
person1.name = '小李'
person1.favorite[0] = '打游戏';
console.log(person1);
console.log(person);
小结:基本数据类型和引用数类型互不影响;
常见的浅拷贝API
- Object.assign();
- …arr //es6剩余参数方法
- concat
深拷贝的API
- $exted