javascript 資料型別 深拷貝

2021-09-06 16:06:12 字數 2856 閱讀 1493

在使用 splice方法 把一維陣列轉化為多維陣列時,之後有用到原來的資料,這個時候就需要多原陣列進行深拷貝,如果只是簡單的複製(var a = b),原陣列在使用過 splice方法後,將不在是ta,在了解深拷貝之前需要先對資料的型別有所熟悉

ecmascript資料型別

值型別(基本型別):

字串(string)、數字(number)、布林(boolean)、對空(null)、未定義(undefined)、symbol。

特點:直接存放在棧中的資料

注:symbol 是 es6 引入了一種新的原始資料型別,表示獨一無二的值。
引用資料型別:

物件(object)、陣列(array)、函式(function)

特點:儲存的是該物件在棧中引用,真實資料存放在堆記憶體中

引用資料型別在棧中儲存了指標,該指標指向堆中該實體的起始位址。當直譯器尋找引用值時,會首先檢索其在棧中的位址,取得位址後從堆中獲得實體。

深淺拷貝示意圖

深拷貝1、基本型別儲存在棧內

2、引用型別 把名存在棧中,值存在堆記憶體中;棧記憶體會提供乙個引用的位址指向堆記憶體中的值

如:x[0] = 5 時,y[0] 也會為 5

如:x[0] = 5 時,y[0] 則不會為 5

deepcopy:

function

(o);

if(o &&

typeof o ===

'object')}

}return obj;

}

let obj =}}

let newobj = obj.

slice(0

)// 注意 slice 只能實現一層的拷貝,對於二級屬性是拷貝不成功的

// 把物件轉化為 字串在進行賦值

let obj =}}

let newobj =

json

.stringify

(obj)

// 注意 雖然json.stringify() 可把物件轉化為 字串進行深拷貝,但是函式卻沒有辦法拷貝

let obj =[1

,2,[

3,4]

,5]let newobj = $.

extend

(true,[

], obj)

// 把 obj 合併到新的陣列中

引數

描述deep

可選。 boolean型別 指示是否深度合併物件,預設為false。如果該值為true,且多個物件的某個同名屬性也都是物件,則該"屬性物件"的屬性也將進行合併。

target

object型別 目標物件,其他物件的成員屬性將被附加到該物件上。

object1

可選。 object型別 第乙個被合併的物件。

objectn

可選。 object型別 第n個被合併的物件。

// 寫法一

const clone1 =

;// 寫法二

const clone2 = object.

assign

( object.

create

(object.

getprototypeof

(obj)),

obj)

;// 寫法三

const clone3 = object.

create

( object.

getprototypeof

(obj)

, object.

getownpropertydescriptors

(obj)

)

寫法一的__proto__屬性在非瀏覽器的環境不一定部署,因此推薦使用寫法二和寫法三; 雖然這幾種方法 也可以實現拷貝,但是拷貝的也這是第一層的屬性

let obj =

}let b = object.

assign

(, obj)

obj.name =

'n3'

obj.act.name =

'n5'

console.

log(obj, b)

// b 中的第一層 name = 'n1'; act 中的 name = 'n5'

就是說 es6 中的 assign 方法也是只能複製到第一層,對於第二層依舊無法完全複製

object.assign方法用於物件的合併,將源物件(source)的所有可列舉屬性,複製到目標物件(target)。

根據個人理解和一些網路提供解決方法,做了乙個簡單的記錄 有時間會不斷更新

JavaScript 資料型別

變數 宣告區域性變數 varmessage 宣告全部變數 message typeof 例如 var message some string alert typeof message string alert typeof message string alert typeof 95 number ...

Javascript資料型別

ecmascript中有5種簡單資料型別 也稱為基本資料型別 1.undefined 該型別只有乙個值,即undefined。在使用var宣告但未初始化時,這個變數就是undefined 2.null 該型別只有乙個值,即null。null undefined 3.boolean 4.number ...

JavaScript資料型別

undefined派生於null,因此在使用 進行比較時會返回true 沒有必要將變數值顯示宣告undefined 宣告空物件時應將其值賦值為nullundefined與null的關係 3 boolean true為真,false為假 true不一定 1,false不一定 0 使用boolean 進...