深拷贝和浅拷贝
1. 内存地址
Array, Function,Object 等等可以认为是除了基本数据类型 String,Number,Boolean,null,undefined,Symbol 以外,所有类型都是引用数据类型
引用数据类型存储在堆内存中,在栈中存储了指针,该指针指向堆中该实体的起始地址
当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体
2. 赋值和深/浅拷贝的区别
这三者的区别如下,不过比较的前提都是针对引用类型:
当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的
浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响
深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响
// 基本数据类型不会影响
let name = 'jsx';
let user = name;
user = 'ljj';
console.log(name, user); // jsx ljj
// 引用类型浅拷贝
let obj = {
name: 'html',
age: 20,
grilfriend: {
name: 'css'
}
}
function lightCopy(obj) {
let target = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
target[key] = obj[key]
}
}
return target;
}
let obj1 = lightCopy(obj);
obj1.grilfriend.name = 'vue';
console.log(obj); // {name: 'html', age: 20, grilfriend: {name: 'vue'}}
console.log(obj1); // {name: 'js', age: 20, grilfriend: {name: 'vue'}}
// 深拷贝
let method = {
user: 'bbc',
info: {
change: true
},
fn: function() {}
}
let newObj = JSON.parse(JSON.stringify(method));
newObj.info.change = 'ok';
console.log(method);
console.log(newObj);
————————————————
版权声明:本文为优快云博主「langmanboy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/langmanboy/article/details/124022060