jsの深いクローン(深いコピー)と浅いクローン(浅いコピー)
16654 ワード
浅いクローン:対応する変数に
深度クローン:データを対応する変数に付与することであり、コピー対象
浅いクローンの実装方法:es 6拡張演算子 forループ
obj 2はobjの影響を受けません.クローンされたものはすべて・
objに参照データ型が存在する場合:
obj 2レプリケーションのobjには
深いクローンの実装方法:
1.オブジェクトの
3.
解決方法、方法2でこれらを濾過する:2.
使用:copyソースに参照タイプ、メソッド、正則、日付等値がなく、通常のデータ型である場合、
に格納された値を直接割り当て、
の場合は
に直接割り当て、
の場合は
に割り当てます.
は
に直接格納され、
は
をスタックメモリに格納するだけであり、真のデータは
に格納され、付与操作時に
のみが付与される.深度クローン:データを対応する変数に付与することであり、コピー対象
の属性であり、メモリに
を開き、元の対象の
をすべてコピーし、元の対象から完全に離れ、新しい対象の属性値
元の対象を修正する.浅いクローンの例
let a = "xu";
let b = a;
alert( b ); // 'xu'
a = "ke";
alert( b ); // 'xu'
// , a b, a , b
let arr1 = [1, 2, 3];
let arr2 = arr1;
console.log( arr2 ); // [ 1, 2, 3]
arr1[0] = 2;
console.log( arr2 ); // [ 2, 2, 3]
// , arr1 arr2, arr1 ,arr2
浅いクローンの実装方法:
const obj ={
name:"xuke",
age:22
}
const obj2 = {
...obj}
console.log(obj2.name) //xuke
let obj = {
name:"xuke",
age:22
}
function clone(obj ){
const result = {
}
for(let key in obj){
result[key] = obj[key];
}
return result
}
let obj2 = clone(obj)
obj.name = "xiannv"
console.log(obj2.name) //xuke
console.log(obj2==obj) //false
obj 2はobjの影響を受けません.クローンされたものはすべて・
で、
に保存されているものなので、objに参照データ型が存在する場合:
let obj ={
name:"xuke",
age:22,
hobby:{
first:"eat",
second:"sleep"
}
}
function clone(obj ){
const result = {
}
for(let key in obj){
result[key] = obj[key];
}
return result
}
let obj2 = clone(obj)
obj.hobby.first= "play"
console.log(obj2.hobby.first) //play
console.log(obj2==obj) //false
obj 2レプリケーションのobjには
が含まれていることがわかります.objの
を修正すると、obj 2の中にも
があります.データはレプリケーション時にobjの
の
を一緒にレプリケーションしたので、objとobj 2はアドレスを使用しているので、obj 2は影響を受けるので、影響を受けずに
を使用する方法を考えています.深いクローンの実装方法:
JSON.parse(JSON.stringify())
深度クローンを実現let obj ={
name:"xuke",
age:22,
hobby:{
first:"eat",
second:"sleep"
}
}
let obj2 = JSON.parse(JSON.stringify(obj))
obj.hobby.first= "play"
console.log(obj2.hobby.first) //eat
console.log(obj2==obj) //false
JSON.parse(JSON.stringify())
深度クローンを実現する弊害:1.オブジェクトの
copyができず、自動的に無視されます.対象中のDate
はcopy,JSONを行うことができない.stringifyメソッドは、日付を自動的に
に変換します.3.
copy,JSON.stringifyメソッドは正則を
に変更します.解決方法、方法2でこれらを濾過する:2.
で深いクローンを実現let obj ={
name:"xuke",
age:22,
hobby:{
first:"eat",
second:"sleep"
}
}
function clone(obj ){
//
if(obj===null) return obj
if(typeof obj !=='object') return obj
if(obj instanceof RegExp){
return new RegExp(obj)
}
if(obj instanceof Date){
return new Date(obj)
}
let newObj = new obj.constructor
for(let key in obj){
if (obj.hasOwnProperty(key)) {
newObj[key] = clone(obj[key] )
}
}
return newObj
}
let obj2 = clone(obj)
obj.hobby.first= "play"
console.log(obj2.hobby.first) //eat
console.log(obj2==obj) //false
使用:copyソースに参照タイプ、メソッド、正則、日付等値がなく、通常のデータ型である場合、
のメソッドを使用し、逆に
のメソッドを使用します.