jsの深いクローン(深いコピー)と浅いクローン(浅いコピー)


浅いクローン:対応する変数に に格納された値を直接割り当て、 の場合は に直接割り当て、 の場合は に割り当てます. に直接格納され、 をスタックメモリに格納するだけであり、真のデータは に格納され、付与操作時に のみが付与される.
深度クローン:データを対応する変数に付与することであり、コピー対象 の属性であり、メモリに を開き、元の対象の をすべてコピーし、元の対象から完全に離れ、新しい対象の属性値 元の対象を修正する.

浅いクローンの例

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        




浅いクローンの実装方法:
  • es 6拡張演算子
  • const obj ={
         
    	name:"xuke",
    	age:22
    }
    const obj2 = {
         ...obj}
    console.log(obj2.name) //xuke
    
  • forループ
  • 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ソースに参照タイプ、メソッド、正則、日付等値がなく、通常のデータ型である場合、 のメソッドを使用し、逆に のメソッドを使用します.