19 js深浅拷贝
数据存储
-
基本数据类型 USONB(一般存放在栈内存)
you(U) are SO N B
undefined string Symbol Object number null boolean
如果是原始数据类型(值本身无法被改变,没有方法)就是除Object之外的都是
-
引用数据类型 (一般变量名,就是其引用地址放在栈内存,真正的数据放在堆内存)
对象 (Object)、数组 (Array)、函数 (Function)、set、map
浅拷贝案例
//浅拷贝
//创建一个新的对象 新的房间
//层次的理解
//拷贝值(如果属性是一般数据类型拷贝的就是基本类型的值
// 如果属性是引用数据类型那么拷贝的就是内存的地址)
//说的直白一点浅拷贝如果碰到的是引用数据类型那么拷贝前和拷贝后是互相影响的
//因此深拷贝就是拷贝引用数据类型时,会开辟新的内存空间拷贝存放
// 这里使用的hasOwnProperty的原因是:for in 会遍历到原型链上的属性,所以要用这个判断,遍历到的属性是不是确实在source对象上面的
function shallowClone(source) {
let newObj = {}
for (const sourceKey in source) {
//hasOwnProperty(属性名)确认该属性是否是其对象的自有属性,若是则返回true
if (source.hasOwnProperty(sourceKey)){
newObj[sourceKey] = source[sourceKey]
}
}
return newObj
}
let a = {name:'sikara',arr:[1,2,3]}
let b = shallowClone(a)
b.name = 'ascse'
b.arr[0] = 6666
console.log(a)
console.log(b)
补充
-
深浅拷贝其他方法
https://xhx.huagecloud.top/archives/14-javascript-bian-liang-de-fu-zhi-he-yin-yong
-
redux,vuex的获取store里的属性都是浅拷贝,可能会有bug(这种情况下需要用深拷贝解决)