一、基本數(shù)據(jù)類型
- 占用內(nèi)存大小固定,存在棧內(nèi)存中,在被復(fù)制時,復(fù)制的是值,修改被復(fù)制的變量,原變量并不會受到影響。
var a= 1;
var b= a;
b = 3;
console.log(a, b); //1 3
二、引用數(shù)據(jù)類型
1. 引用數(shù)據(jù)類型的值是對象,存在堆內(nèi)存上,引用類型的變量實際上存的是指針,指向堆上的對象,在復(fù)制時,復(fù)制的是指針,修改其中一個變量,另一個也會被改變。
var A= {a:1};
var B= A;
B.a = 3;
console.log(A.a, B.a); //3 3
以上就是淺拷貝
2. 怎樣深拷貝,使拷貝后變量間不影響
a. 數(shù)組用slice、concat解決,返回新數(shù)組
var arr = [0,1,2];
var copyArr = arr.concat();
copyArr[0] = 100;
console.log(copyArr[0], arr[0]); //100 0
b. 對象,
按照實現(xiàn)原理,遍歷源對象的每個屬性,拷貝給新對象的屬性*
var obj = {name:'a', age: 20};
var newObj = new Object();
newObj.name = obj.name;
newObj. age = obj. age;
newObj.name = 'c';
console.log(obj, newObj ); //{name: "a", age: 20} {name: "c", age: 20}
實現(xiàn)方法:
function deepCopy(source){
var result = {};
for(let key in source){
if(typeof source[key] === object){
deepCopy(source[key])
}else{ result[key] =source[key] }
}
}
js提供的方法:Object.assign() 方法用于將所有可枚舉屬性的值從一個或多個源對象復(fù)制到目標(biāo)對象。它將返回目標(biāo)對象。
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(returnedTarget, target, source); //{a: 1, b: 4, c: 5} {a: 1, b: 4, c: 5} {b: 4, c: 5}