函式,第乙個引數為目標物件,後面依次為源物件
//將來自乙個或多個源物件中的值複製到乙個目標物件
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 ...