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 를 이용하여 복잡한 객체를 가진 배열을 처리한다. |




Views Today : 12
Views Yesterday : 54
Views This Month : 201
Views This Year : 5247
Total views : 85338
Who's Online : 0