js中对象分为基本类型和复合(引用)类型,基本类型存放在栈内存,复合(引用)类型存放在堆内存。
1.浅拷贝
简单的变量拷贝,并不会发生引用
var a = 123456; var b = a; a = 456789; console.log(a)//456789; console.log(b)//123456;
引用只发生在对象的身上,因为对象引用的是一个地址,那么两个都同时指向了一个地址,那么改变其中一个,另一个也必然会改变。
数组
var arr = [1,2,3]; var arr1 =arr; arr.push(4); console.log(arr)//[1,2,3,4]; console.log(arr1)//[1,2,3,4];
对象
var obj = {
name:"name",
};
var obj1 =obj;
obj1.age = "45";
console.log(obj);
console.log(obj1)
2.深拷贝
深拷贝和浅拷贝最根本的区别:深拷贝可以拷贝出一个全新的内存地址。
(1)深拷贝在计算机中开辟了一块内存地址用于存放拷贝的对象。
(2)浅拷贝仅仅是指向被拷贝的内存地址,如果原地址中对象发生了改变,那么浅拷贝出来的对象也会相应的改变。
在处理深拷贝的时候,我们可以利用递归的思想来实现,节省性能,并且不会发生引用。
josn: var test ={ name:{ xing:{ first:'张', second:'李' }, ming:'你好' }, age :40, friend :['123','456','789'] } var result = JSON.parse(JSON.stringify(test)); result.age = 30 result.name.xing.first = '陈' result.friend.push('101112;4567899'); console.dir(test) console.dir(result)
var ojj = {a:1,arr:[1,2]}; var sha = shall(ojj); function shall(src){ var dst ={}; for(var prop in src){ console.log(prop) if(src.hasOwnProperty(prop)){ dst[prop]=src[prop]; } } return dst; } sha.bgg="21"; console.log(sha,ojj)