淺拷貝:拷貝一層,深層次的對象級別的就拷貝引用。html
深拷貝:拷貝多層,每一級別的數據都會拷貝出來。數組
基本數據類型:number 、 string 、 null 、 undefined 、 boolean 、 symbolbash
引用數據類型:objectfrontend
棧(stack): 存儲的是基本數據類型的值和引用數據類型的地址,由系統自動分配內存,系統自動釋放內存。函數
堆(heap): 存儲的是引用數據類型的值,由開發者分配內存(如使用 new 關鍵字進行分配),大小不定,不會自動釋放內存。ui
值傳遞 和 址傳遞 的區別。this
基本數據類型是值傳遞;引用類型是址傳遞,將存放在棧內存中的地址賦值給接收的變量。
spa
1. Object.assign(target, ...sources)prototype
target : 目標對象code
sources : 源對象
let a = {
age:1
}
let b = Object.assign({}, a);
a.age = 2;
console.log(b.age); //1
複製代碼
2. { ... obj} 擴展運算符
let a = {
age: 1
}
let b = {...a};
a.age = 2;
console.log(b.age); //1複製代碼
1.JSON.parse(JSON.stringify(sourceObj))
let a = {
age: 1,
jobs: {
main:'frontend'
}
}
let b = JSON.parse(JSON.stringify(a));
a.jobs.main = 'backend';
console.log(b.jobs.main); //'frontend'複製代碼
JSON.parse(JSON.stringify(sourceObj)) 實現深拷貝的侷限:
2.使用 loadash 的 cloneDeep() 方法
var _ = require('lodash');
var obj1 = {
a: 1,
b: { f: { g: 1 } },
c: [1, 2, 3]
};
var obj2 = _.cloneDeep(obj1);
console.log(obj1.b.f === obj2.b.f);
// false複製代碼
淺拷貝,即到數組只有一維的時候,且每一項不是對象的話這樣拷貝看起來和深拷貝效果同樣。
1.Array.prototype.slice()
const a = [1,2,3]
const b = a.slice();
a.push(4);
console.log(a);//[1,2,3,4]
console.log(b);//[1,2,3]複製代碼
淺拷貝一個數組,這樣操做新數組時,就不會改變原數組。
slice不修改原數組,只返回一個淺複製了原數組總的元素的一個新數組。原數組的元素會按照下述規則拷貝:
若是向兩個數組任一中添加了新元素,則另外一個不會受到影響。
2. Array.prototype.concat()
const a = [1,2,3]
const b = a.concat();
a.push(4);
console.log(a);//[1,2,3,4]
console.log(b);//[1,2,3]複製代碼
concat方法建立一個新的數組,它由被調用的對象中的元素組成,每一個參數的順序依次是該參數的元素(若是參數是數組)或參數自己(若是參數不是數組)。它不會遞歸到嵌套數組參數中。
concat方法不會改變this或任何做爲參數提供的數組,而是返回一個淺拷貝,它包含與原始數組相結合的相同元素的副本。 原始數組的元素將按照以下規則複製到新數組中:
和對象的深拷貝方法相同。
參考:https://www.cnblogs.com/Bonnie3449/p/9510431.html