콘솔처리해보면 복사가 되는 건 똑같다. 이 때 obj2는 obj1 값을 실물 그대로 가져온 게 아니라, obj1을 가리키는 주소값, 링크를 가져온거다. (like POINTER) 따라서, obj1 과 obj2를 비교해보면 주소값이 같기 때문에 true 가 나온다.
#2 - obj3을 obj1과 동일한 key,속성값을 가진 객체로 만든 경우 (대입X)
내부 데이터는 같을지언정, 컴퓨터는 둘을 다른 데이터 주소값으로 저장해주기 때문에 obj3과 obj1을 비교해보면 주소값이 다르기 때문에 false가 나온다.
#3. - 마지막으로 obj3, obj1 의 객체 속성값을 비교해보면?!
obj1.name 과 obj3.name 서로 다른 객체 안에 있지만, 어쨌든 객체 내부의 원시값 자체는 깊은 복사가 되기 때문에, 둘을 비교하면 name : "kim" 은 같은 string값이므로 true가 출력된다.
Object.assign(A , B)
단어 뜻 그대로 객체를 할당해주는 역할 / 객체 내부의 데이터값들을 바꿔준다!
사용법 / Object.assign(A , B)
첫번째에 들어가는 매개변수 A : 속성을 바꿔줄 객체 (바꿔줘!)
두번째에 들어가는 매개변수 B : A에 넣고 싶은 속성을 가지고 있는 객체 (어 바꿔줄게!)
연습삼아 두 가지 경우를 해보았고 결론부터 말하자면 아래와 같다.
1- 이미 속성값들을 가진 객체를 바꿔주면서 새로운 변수에 담아준 경우 - > 깊은 복사가 됐다
2- 바꿔줄 객체를 빈 객체로 설정해 그 빈 객체에 복사를 한 경우 -> 얕은 복사가 됐다
#1. 깊은 복사가 된 경우
let yj = {
name : 'A',
age : 29,
footsize : 230
}
let wantChange = {
name : 'A',
age : 20,
height : 170,
}
let changedYj = Object.assign(yj,wantChange)
console.log(changedYj)
console.log(yj)
console.log(yj===changedYj) // true
이미 속성이 있는 yj에 다른 객체 wantChange를 복사해준다. <출력> name : 'A' 같으니까 그대로 있고 age : 29 -> 20 으로 바뀌고 footsize : 230 은 다른 객체인 wantChange에 없는 속성이므로 그대로 가져간다. height: 170 은 그대로 복사 되어 추가된다.
바뀐 yj 객체를 변수 changedYj에 담아주고 yj 와 changedYj를 콘솔 찍어보니 같은 객체가 나온다.
둘을 비교해보면? changedYj는 yj를 기반한 객체이므로 둘을 비교해보면 같은 참조값을 가진 객체이기때문에 true가 나온다.
#2. 얕은 복사가 된 경우
let lee = {
name : 'leeyj',
age : 30
}
let Newlee = Object.assign({},lee)
console.log(lee)
console.log(Newlee)
console.log(Newlee===lee) // false
lee라는 객체를 복사해서 담아줄 Newlee라는 변수를 선언해준다. 그리고 여기에 Object.assign({ },lee)를 담아줬다. 즉, 빈 객체 { } 에 lee를 담아줬고, 콘솔을 찍어보면, lee 객체나 Newlee 객체나 같은 객체로 출력된다.
근데? 둘을 비교해보면?
false가 나온다.
왜냐면, Newlee는 lee의 속성만을 복사해온거지, lee 객체 자체를 가져온 게 아니다. 새로운 빈 객체 { } 안에 lee 속성을 넣은 거니까 얕은 복사가 된거다. 그래서 결과물은 lee와 Newlee가 같지만 엄연히 따지면 다른 참조값을 가진 객체이므로 false이다!