React : Shallow copy & deepCopy
ㆍ1) 단순배열의 얕은복사와 깊은 복사
const [ data , setData ] = useState([1,2,3,4,5,6,7]); |
const myDataShallow = data; // 앝은복사 myDataShallow 은 원본 data 를 “참조” console.log(‘myDataShallow === data : ‘ , myDataShallow === data) // true : 같은 객체 (참조) myDataShallow[1] = 22 // myDataShallow[1] 의 값을 변경 했지만 data를 [참조]하고 있기때문에 같이변함 console.log(data[1]) // 22 출력 console.log(myDataShallow[1]) // 22출력 data[1] = 2 // 다음테스트를위해 원래대로 값 변경 const myDataDeep = […data]; // 깊은복사 myDataDeep 은 원본 data 에서 “복사” (… 전개연산자 이용) console.log(‘myDataDeep === data : ‘ , myDataDeep === data); // false : 다른객체( 데이터만 복사) myDataDeep[1] = 22 // myDataDeep[1] 의 값을 변경 했지만 data의 값만 [복사] 했기때문에 data 는 변경되지 않음 console.log(data[1]) // 2 출력 console.log(myDataDeep[1]) // 22 출력 |
const [ Info , setInfo] = useState([ { name:’Michael’ , tel : [‘010-0000-0000’ , ‘010-000-0001’] } , { name:’Jhon’ , tel : [‘010-1111-0000’ , ‘010-111-1001’] } , { name:’Steve’ , tel : [‘010-2222-0000’ , ‘010-222-2001’] } , ]) | ||
const myArrayShallow= Info; // // 앝은복사 myDataShallow 은 원본 data 를 “참조” myArrayShallow[0] = ‘My friend List’ myArrayShallow[1].tel[0] = ‘010-xxxx-xxxx’ myArrayShallow[1].name = ‘Json’ myArrayShallow[2].name = ‘Tom’ console.log(“Info[0]” , Info[0]) console.log(“myArrayShallow[0]” , myArrayShallow[0]) console.log(“Info[1].name” , Info[1].name) console.log(“Info[2].name” , Info[2].name) console.log(“Info[1].tel[0]” , Info[1].tel[0]) console.log(“myArrayShallow[1].name” , myArrayShallow[1].name) console.log(“myArrayShallow[2].name” , myArrayShallow[2].name) console.log(“myArrayShallow[1].tel[0]” , myArrayShallow[1].tel[0]) console.log(‘Info === myArrayShallow’, Info === myArrayShallow) console.log(‘Info[0] === myArrayShallow[0]’, Info[0] === myArrayShallow[0]) console.log(‘Info[1] === myArrayShallow[1]’, Info[1] === myArrayShallow[1]) console.log(‘Info[1].tel[0] === myArrayShallow[0].tel[0]’,Info[1].tel[0] === myArrayShallow[1].tel[0])
const myArrayDeep = […Info] // 깊은복사 myArrayDeep 은 원본 Info 에서 값 “복사” 함 (… 전개연산자 이용) // 깊은복사 테스트를 위해 원래대로 변경 Info[1].tel[0] = ‘010-0000-0000’ Info[0] = ‘friend List’ myArrayShallow[1].name = ‘Michael’ // 값 변경 myArrayDeep[0] = ‘My friend List’ myArrayDeep[1].tel[0] = ‘010-xxxx-xxxx’ myArrayDeep[1].name = ‘Jenny’ myArrayDeep[2].name = ‘Jackson’ console.log(“Info[0]” , Info[0]) console.log(“myArrayDeep[0]” , myArrayDeep[0]) console.log(“Info[1].name” , Info[1].name) console.log(“Info[2].name” , Info[2].name) console.log(“Info[1].tel[0]” , Info[1].tel[0]) console.log(“myArrayDeep[1].name” , myArrayDeep[1].name) console.log(“myArrayDeep[2].name” , myArrayDeep[2].name) console.log(“myArrayDeep[1].tel[0]” , myArrayDeep[1].tel[0]) console.log(‘Info === myArrayDeep’, Info === myArrayDeep) console.log(‘Info[0] === myArrayDeep[0]’, Info[0] === myArrayDeep[0]) console.log(‘Info[1] === myArrayDeep[1]’, Info[1] === myArrayDeep[1]) console.log(‘Info[1].tel[0] === myArrayDeep[0].tel[0]’,Info[1].tel[0] === myArrayDeep[1].tel[0])
|
ㆍ단순 1차원 배열(객체를 가지고 있지않은) 에서는 얕은복사와 깊은복사는 정상적으로 이루어짐 const [ data , setData ] = useState([1,2,3,4,5,6,7]); ㆍ객체( 다차원배포함)를 포함한 배열에서의 얕은복사는 정상 이지만 ,깊은복사에서 배열안에 “객체들은 얕은복사”가 됨1차원의 값들은 정상적으로 깊은복사가됨 const [ Info , setInfo] = useState([ “friend List”, { name:’Michael’ , tel : [‘010-0000-0000’ , ‘010-000-0001’] } , { name:’Jhon’ , tel : [‘010-1111-0000’ , ‘010-111-1001’] } , { name:’Steve’ , tel : [‘010-2222-0000’ , ‘010-222-2001’] } , [1,2,3], 200, ]) [얕은복사] : 단순 배열일때와 같은 모든 요소가들이 참조로 복사된다. 그 배열이 가지고 있는 객체들까지는 깊은복사가아닌 얕은복사가 되어 ‘참조’ 됨 info 객체 자체 , 그 다음 0,5 번째요소인 “friend List” 와 200 만 정상적으로 깊은복사가 되고, 객체를 가진 요소는깊은 복사가 안됨(얕은(참조) 복사가 됨)결국 0 번째요소의 “값” 은 정상적으로 깊은복사되지만 , “객체”는 여전히 얕은복사가 된다.) 그래서 Immer 를 이용하여 복잡한 객체를 가진 배열을 처리한다. |