一、記憶體的堆疊
基本型別
存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配,當它賦給另乙個變數的時候,另乙個變數發生改變,原資料不會發生改變:
var a = 5;
var b = a;
b += 1;
console.log(b) //6
console.log(a) //5
5種基本資料型別有undefined、null、boolean、number 和 string,它們是直接按值存放的,所以可以直接訪問。
引用型別
存放在堆記憶體中的物件,變數實際儲存的是乙個指標,這個指標指向另乙個位置。每個空間大小不一樣,要根據情況進行特定的分配。當我們需要訪問引用型別(如物件,陣列,函式等)的值時,首先從棧中獲得該物件的位址指標,然後再從堆記憶體中取得所需的資料。
上面的例子把a的值賦值給b,當b的值發生改變的時候,a的值也會跟隨改變,像上面的**一樣,a和b都是指向同乙個位址。如果要讓b得到乙個獨立的位址呢?這就涉及到拷貝了。
二、object.assign
淺拷貝是複製淺層的引用型別,比如複製a = 這樣的物件就是屬於淺拷貝,它只有一層,像複製b = }這樣有巢狀的物件,多層的引用型別,就需要用到深拷貝了。
var a = ;
var b = object.assign({} , a);
b.username = 'xiaoming';
console.log(a); //
console.log(b); //
這樣,我們就能得到乙份淺拷貝內容了,即使是b發生改變,也不會影響到a,它們完全是兩個獨立的個體,但是此方法不適用深拷貝。
三、展開運算子
var a = ;
var b = ;
b.username = 'xiaoming';
console.log(a); //
console.log(b); //
這樣,我們也能得到乙份淺拷貝內容。
四、json.parse()&json.stringify()
var a = };
var b = json.parse(json.stringify(a));
b.info.username = 'xiaoming';
console.log(a); // };
console.log(b); // };
五、for...in&遞迴(推薦)var a = };
var b = copy(a);
b.info.username = 'xiaoming'
function copy(obj);
for(var attr in obj)
else
}return result;
} console.log(a); // };
console.log(b); //
這樣,就可以得到乙份深拷貝內容了,其原理就是層層拷貝,利用遞迴的原理,直到最底層不是物件為止,好啦,本次分享就到這裡了,如果有什麼不正確的地方,請各位不吝賜教,謝謝~ 理解「淺拷貝」和「深拷貝」
淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...
c 淺拷貝和深拷貝理解
為什麼c 會設定這兩種拷貝呢,因為在某些情況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是說把物件裡的值完全複製給另乙個物件,如a b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那麼a中的那個成員變數也指向同一塊記憶體。這就出現了問題 當b把記憶體釋放了 析構 這時a記憶體就成...
深拷貝和淺拷貝的理解
為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...