深浅拷贝针对得是object和array这样得引用数据类型得
浅拷贝
eg:浅拷贝(for..in,Object.assign(),... Array.prototype.slice(),Array.prototype.concat())
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址
var qian = {
name: 'qiankaobei',
age: 18,
language: [1, [2, 3, [4, 5]]]
}
var qianfuzhi = Object.assign({}, qian)
qianfuzhi.name = "qiankaobeiname"
qianfuzhi.language[0] = 0
console.log('qian', qian, '--------', 'qianfuzhi', qianfuzhi);
深拷贝
深拷贝(JSON.parse(JSON.stringify()),第三方库lodash)
深拷贝会开辟新的栈,两个对象对应两个不同的地址,修改对象A的属性,并不会影响到对象B。
var shen = {
name: 'shenkaobei',
age: 18,
language: [1, [2, 3, [4, 5]]]
}
var shenfuzhi = JSON.parse(JSON.stringify(shen))
shenfuzhi.name = "shenkaobeiname"
shenfuzhi.language[0] = 0
console.log('shen', shen, '--------', 'shenfuzhi', shenfuzhi);
总结
(1)拷贝是为了部分或全部复用原对象的属性,在原对象的基础上创建一个新的对象。
(2)浅拷贝是拷贝后两个对象地址不相等,但两个对象的部分属性地址相等,新对象并没有拷贝所有的属性,而是复用原对象中的值。
(3)深拷贝是拷贝后两个对象不仅地址不相等,两个对象的所有属性地址都不相等。