1:前置技能
一般数据类型:number string boolean undefined null
引用数据类型:obj
2:深拷贝和浅拷贝
浅拷贝:创建一个新对象,有着原始对象属性值的一份精确拷贝。
如果属性是基本类型,拷贝的是基本类型的值。
如果属性是引用类型,拷贝的就是内存地址,如果其中一个对象改变了这个地址,就会影响到另一个对象
深拷贝:将一个对象从内存中完整的拷贝一份出来,放到从内存中新开辟的区域,且修改新对象不影响原对象
3:赋值
赋值:把一个对象赋值给新的变量的时候,赋的其实是该对象在栈中的地址,而不是堆中数据。也就是两个对象指向同一空间,无论哪个对象改变,都是改变了储存空间的内容。因此两个对象是联动的。
所以赋值是你爹复制家里的一把钥匙给你
var sb = {
name: '二狗',
hobby: ['学习', ['看电影','shopping' ],'跑步']
}
var sb1 = sb
sb1.name = '铁蛋'
sb1.hobby[0] = '打游戏'
console.log(sb);
console.log(sb1);
复制代码
浅拷贝:重新在堆中创建内存空间,拷贝前后,基本数据类型互不影响,但拷贝前后对象引用资源共享同意内存,会互相影响
就是你爹把家里钥匙复制了给你,但你爹保险柜钥匙他不会给你。你懂了吗
var sb = {
name: '二狗',
hobby: ['学习', ['看电影', 'shopping'], '跑步']
}
function dd(sb) {
var target = {}
for (var i in sb) {
if (sb.hasOwnProperty(i)) {
target[i]=sb[i]
}
}
return target
}
var sb1 = dd(sb)
sb1.name = '铁蛋'
sb1.hobby[0] = '打游戏'
console.log(sb);
console.log(sb1);
复制代码
深拷贝:在堆中开辟新的区域存放新对象,对对象中子对象进行递归拷贝,拷贝前后两对象互不影响
你爹把家里钥匙和保险柜钥匙都给你了,并且让你自立门户
// 递归操作
var sb = {
name: '二狗',
hobby: ['学习', ['看电影', 'shopping'], '跑步']
}
function deep(sb) {
var target = new sb.constructor()
if(typeof sb!=='object')return sb
for (var i in sb) {
if (sb.hasOwnProperty(i)) {
target[i] = deep(sb[i])
}
}
return target
}
//var sb1 = deep(sb)
var sb1 = JSON.parse(JSON.stringify(sb))
sb1.name = '铁蛋'
sb1.hobby[0] = '打游戏'
console.log(sb);
console.log(sb1);
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END