
面試總是遇到這個問題,那不如自己總結加深一下印象.
- 1.如何區分
- 2.基本資料型別與復雜(參考)資料型別
- 3.實作方法
- 3.1 淺拷貝
- 3.2 深拷貝
1.如何區分
深拷貝與淺拷貝,簡單點來說,就是假設B復制了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝 ; 如果B沒變,那就是深拷貝,
來看個淺拷貝的例子:
let a=[0,1,2,3,4];
let b=a;
console.log(a === b); //true
a[0]=1;
console.log(a,b); // a=[1,2,3,4,5] b=[1,2,3,4,5]
這是為什么,我沒改b陣列里的值啊?嗯? ? ? ?

查了資料后發現,這跟資料型別有了關系,那么接下來先講講資料型別

2.基本資料型別與復雜(參考)資料型別
面試經常會問到的問題: 資料型別有哪些?

既然知道了大概,那我們先來說說基本型別.

2.1 基本型別 ------ 變數名和值都 存盤在堆疊記憶體中

2.2 參考型別 -------變數名在堆疊記憶體中, 堆疊記憶體提供一個參考的地址指向堆記憶體中的值

看到這兒,我突然明白了.因為上面的a和b所參考的堆地址是一樣的,所以我給a陣列項賦值,b陣列里面的值也會變.

3.實作方法
3.1 淺拷貝
- Object.assign()
//目標物件
const target = { a: 1 };
// 被合并的源物件
const source1 = { b: 2 };
const source2 = { c: 3 };
// Object.assign()方法的第一個引數是目標物件,后面的引數都是源物件,
Object.assign(target, source1, source2);
console.log(target) // {a:1, b:2, c:3}
Object.assign()拷貝的屬性是有限制的,只拷貝源物件的自身屬性(不拷貝繼承屬性),也不拷貝不可列舉的屬性(enumerable: false)
注意: 如果目標物件與源物件有同名屬性,或多個源物件有同名屬性,則后面的屬性會覆寫前面的屬性,
如果還想更詳細的了解Object.assign()方法可以看看阮一峰老師的ES6入門講解
鏈接: ES6標準入門.
3.2 深拷貝
- JSON物件的parse和stringify
function deepClone(obj) {
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a = [0, 1, [2, 3], 4],
b = deepClone(a);
a[0] = 1;
a[2][0] = 1;
console.log(a, b);
可以看到,這下b是完全不受a的影響了,

- jQuery.extend()
$.extend( [deep ] , target, object1 , [objectN ] )
deep: 表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝,
target: Object型別 目標物件,其他物件的成員屬性將被附加到該物件上,
object1,objectN(可選): Object型別 第一個以及第N個被合并的物件,
let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
可以看到和上面的效果是一樣的,只是需要依賴jQuery庫

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/295664.html
標籤:其他
下一篇:谷粒學院第四天
