物件常用的方法和物件的拷貝

2021-09-23 10:45:48 字數 4652 閱讀 6610

函式,第乙個引數為目標物件,後面依次為源物件

//將來自乙個或多個源物件中的值複製到乙個目標物件

var first =

;var last =

;var person = object.

assign

(first, last)

;console.

log(person)

;//,注意這裡first因為是第乙個引數會被當成目標物件,所以first自身屬性也被更改為和person一樣了,即first === person

//用於轉殖物件

var clone = object.

assign

(, person)

;

函式

//阻止修改現有屬性的特性和值,並阻止新增新屬性

var a =

;object.

freeze

(a);

//此時不允許新增或修改a的任何屬性

函式

//用於判斷兩個值是否相同

object.

is(a, b)

;//返回true或false

//注意,該函式與==運算子不同,不會強制轉換任何型別,應該更加類似於===,但值得注意的是它會將+0和-0視作不同值

函式

//用於返回物件可列舉的屬性和方法的名稱

var a =};

object.

keys

(a);

//['name', 'age', 'func']

函式

//將屬性新增到物件,或修改現有屬性的特性

var a =

;object.

defineproperty

(a,'name',)

//與之對應的是object.defineproperties函式,可新增多個屬性

object.

defineproperties

(a,,

job :

})

//hasownproperty方法

//確定某個物件是否具有帶指定名稱的屬性,有的話返回true,否則false

//注意,該方法不會檢查物件原型鏈中的屬性

var s =

newstring

('123');

console.

log(s.

hasownproperty

('split'))

;//false

console.

log(string.prototype.

hasownproperty

('split'))

;//true

//hasownproperty方法

//確定某個物件是否具有帶指定名稱的屬性,有的話返回true,否則false

//注意,該方法不會檢查物件原型鏈中的屬性

var s =

newstring

('123');

console.

log(s.

hasownproperty

('split'))

;//false

console.

log(string.prototype.

hasownproperty

('split'))

;//true

//isprototypeof方法

//確定乙個物件是否存在於另乙個物件的原型鏈中

functiona(

)var b =

newa()

;console.

log(a.prototype.

isprototypeof

(b))

;//true

淺拷貝的意思就是只複製引用(指標),而未複製真正的值。

const originarray =[1

,2,3

,4,5

];const originobj =};

const clonearray = originarray;

const cloneobj = originobj;

console.

log(clonearray)

;// [1,2,3,4,5]

console.

log(originobj)

;// }

clonearray.

push(6

);cloneobj.a =

;console.

log(clonearray)

;// [1,2,3,4,5,6]

console.

log(originarray)

;// [1,2,3,4,5,6]

console.

log(cloneobj)

;// ,b:'b',c:array[3],d:}

console.

log(originarray)

;// ,b:'b',c:array[3],d:}

上面的**是最簡單的利用 = 賦值操作符實現了乙個淺拷貝,可以很清楚的看到,隨著 clonearray 和 cloneobj 改變,originarray 和 originobj 也隨著發生了變化。

const originarray =[1

,2,3

,4,5

];const clonearray =

json

.parse

(json

.stringify

(originarray));

console.

log(clonearray === originarray)

;// false

const originobj =};

const cloneobj =

json

.parse

(json

.stringify

(originobj));

console.

log(cloneobj === originobj)

;// false

cloneobj.a =

'aa'

;cloneobj.c =[1

,1,1

];cloneobj.d.dd =

'doubled';

console.

log(cloneobj)

;// };

console.

log(originobj)

;// };

確實是深拷貝,也很方便。但是,這個方法只能適用於一些簡單的情況。比如下面這樣的乙個物件就不適用:

const originobj =

}console.

log(originobj)

;//

const cloneobj =

json

.parse

(json

.stringify

(originobj));

console.

log(cloneobj)

;//

undefined、function、symbol 會在轉換過程中被忽略,如果物件中含有乙個函式時(很常見),就不能用這個方法進行深拷貝

就是對每一層的資料都實現一次 建立物件->物件賦值 的操作

function

deepclone

(source)

;// 判斷複製的目標是陣列還是物件

for(

let keys in source)

; targetobj[keys]

=deepclone

(source[keys]);

}else}}

return targetobj;

}

const originobj =};

const cloneobj =

deepclone

(originobj)

;console.

log(cloneobj === originobj)

;// false

cloneobj.a =

'aa'

;cloneobj.c =[1

,1,1

];cloneobj.d.dd =

'doubled'

; console.

log(cloneobj)

;// };

console.

log(originobj)

;// };

const originobj =

}console.

log(originobj)

;//

const cloneobj =

deepclone

(originobj)

;console.

log(cloneobj)

;//

物件陣列的深拷貝和物件的深拷貝

1 對於 普通陣列 陣列元素為數字或者字串 深拷貝很簡單,拷貝之後兩個陣列指標指向的儲存位址不同,從而完成深拷貝 var test 1,2,3 原陣列 var testcopy concat test 拷貝陣列 testcopy 0 4 console.log test 1,2,3 console....

js物件拷貝的方法

物件拷貝的方法是乙個難點,尤其是深拷貝。建議把 都執行下,幫助理解拷貝。1.適合情況 json物件的深度轉殖。方法是先json.stringify 轉為json字串,再json.parse 轉為json陣列 2.缺點 a.如果你的物件裡有函式,函式無法被拷貝下來 b.無法拷貝copyobj物件原型鏈...

js物件拷貝的方法

1.適合情況 json物件的深度轉殖,方法是json.stringify 轉化為json字串,再json.parse 轉為json陣列 2.缺點 a.如果你的物件裡面有函式,函式無法被拷貝下來 b.無法拷貝copyobj物件原型鏈上得屬性和方法 var obj 相同的引用 var obj2 boj ...