面試複習之Js複習物件的深淺拷貝

2021-09-11 01:35:26 字數 1648 閱讀 7625

對於基本型別來說,如果使用字面量的方式,那麼這個變數只是個字面量,只有在必要的時候才會轉換為對應的型別

let a = 111 // 這只是字面量,不是 number 型別

a.tostring() // 使用時候才會轉換為物件型別

物件(object)是引用型別,在使用過程中會遇到淺拷貝和深拷貝的問題。

物件的淺拷貝(在複製值的時候複製的是指向堆記憶體的指標地方),而深拷貝在複製的時候在堆記憶體中重新複製了乙份值放在堆新的位置。

let a = 

let b = a

b.name = 'ef'

console.log(a.name) // ef

a.基本型別–名值儲存在棧記憶體中,例如let a=1;】

當你b=a複製時,棧記憶體會新開闢乙個記憶體,例如這樣:

所以當你此時修改a=2,對b並不會造成影響,因為此時的b已自食其力,翅膀硬了,不受a的影響了。當然,let a=1,b=a;雖然b不受a影響,但這也算不上深拷貝,因為深拷貝本身只針對較為複雜的object型別資料。

當b=a進行拷貝時,其實複製的是a的引用位址,而並非堆裡面的值。

而當我們a[0]=1時進行陣列修改時,由於a與b指向的是同乙個位址,所以自然b也受了影響,這就是所謂的淺拷貝了。

那,要是在堆記憶體中也開闢乙個新的記憶體專門為b存放值,就像基本型別那樣,豈不就達到深拷貝的效果了

如何實現深拷貝?

遞迴去複製所有層級屬性。

//es6箭頭函式語法

var deepclone = obj => 或者,

// 這樣可以保持原形鏈的繼承;

var newobj = new obj.constructor();

//在內部返回快速執行函式的原因是,遞迴呼叫時,若直接使用外部函式名,當外部函式名更改時,內部遞迴不能正常直接

//所以在內部定義乙個函式去呼叫

return (function foo()

}return newobj;

})()

}var a = [1, 2, 3, 4, 5, 6];

var b = deepclone(a);

b[3] = 0;

console.log(a);

console.log(b);

js複習之 Date對像

date 物件用於處理日期和時間。var mydate new date 注釋 date 物件會自動把當前日期和時間儲存為其初始值。ff firefox,ie internet explorer 屬性描述 ffie constructor 返回對建立此物件的 date 函式的引用。14 protot...

js基礎複習之arguments

在呼叫函式時,瀏覽器每次都會傳遞進兩個隱含的引數 1.函式的上下文物件 this 2.封裝實參的物件 arguments arguments是乙個類陣列物件,它也可以通過索引來運算元據,也可以獲取長度 在呼叫函式時,我們所傳遞的實參都會在arguments中儲存 arguments.length可以...

物件導向的複習

物件導向通過函式 封裝得到乙個類,備註 類的本質還是函式 1 每個類 函式 天生有乙個 prototype 的屬性,這個 prototype 又是乙個物件,這個物件裡面有個 construction 建構函式 的屬性,屬性值是類本身。2 我們所有 new 乙個類的時候,其實是呼叫它的建構函式。建構函...