1、回顧
數據傳遞的方法:
值傳遞:基本數據類型的數據不會發改變,因為基本數據類型一般存放在棧里面,值傳遞只是將數據拷貝了一份給另一個變量
引用傳遞:會改變內存中的數據,因為引用類型的數據都存放在堆里面,棧里面存放的是索引,拷貝的時候是拷貝的地址也就是索引
例如:
值傳遞
var a = 10;
var b = a;
b+=10;
console.log(a);//10
console.log(b);//20;
引用傳遞
var arr = [10,20,30,40];
var newArr = arr;
newArr[0] = 80;
console.log(arr);//[80,20,30,40]
console.log(newArr);//[80,20,30,40];
因為引用數據類型傳遞是保存了內存中的地址,當一個數據發生改變的時候 地址里面的數據也會發送改變
2、淺拷貝
淺拷貝:所謂的淺拷貝就是復制一份引用數據類型的地址,當改變了內存中數據的某一個值得話,也會影響到另一個對象
淺拷貝的方式:
淺拷貝1
var obj = {name:"張三",age:19,sex:"男"}
var newObj = obj;
newObj.name="李四";
console.log(obj);//{name:"李四",age:19,sex:"男"}
console.log(newObj);//{name:"李四",age:19,sex:"男"}
淺拷貝2
Object.assgin()
參數1:目標對象
參數2:任意多個對象
如果對象是多層的話
var obj = {data:{a:1,b:2,c:3}};
var obj1 = Object.assign({},obj);
obj1.data.a = 10;
console.log(obj);//{data:{a:10,b:2,c:3}}
淺拷貝3
封裝CopyAttr()
如果對象是多層的話
function copyAttr(obj){
var newObj = {};
for(var key in obj){
newObj[key] = obj[key];
}
return newObj;
}
var obj = {data:{a:1,b:2,c:3}};
var newObj = copyAttr(obj);
newObj.data.a = 10;
console.log(obj)//{data:{a:10,b:2,c:3}}
淺拷貝4
$.extend({},obj)
var obj = {data:{a:1,b:2,c:3}};
var newObj = $.extend({},obj);
newObj.data.a = 10;
console.log(obj);//{a: 10, b: 2, c: 3}
console.log(newObj);//{a: 10, b: 2, c: 3}
3、深拷貝
深拷貝:所謂的深拷貝就是復制一份引用數據類型的數據,當改變了數據的某一個值得話,不會影響到另一個對象(注意深拷貝是拷貝的數據,而不是索引,淺拷貝拷貝的是索引而不是數據)
深拷貝1 Object.assign(); 如果對象只有一層的 var obj = {a:1,b:2,c:3}; var newObj = Object.assign({},obj); newObj.a = 10; console.log(obj);//{a: 1, b: 2, c: 3} console.log(newObj);//{a: 10, b: 2, c: 3} 深拷貝2 $.extend(true,{},obj) var obj = {a:1,b:2,c:3}; var newObj = $.extend(true,{},obj); newObj.a = 10; console.log(obj);//{a: 1, b: 2, c: 3} console.log(newObj);//{a: 10, b: 2, c: 3} 深拷貝3 JSON.stringify() var obj = {data:{a:1,b:2,c:3}}; var newObj = JSON.parse(JSON.stringify(obj)); newObj.data.a = 10; console.log(obj);//{a: 1, b: 2, c: 3} console.log(newObj);//{a: 10, b: 2, c: 3} 缺點:沒有辦法將函數轉換為json

