var 값 = '제로초';
var 복사 = 값;
복사 = '홍길동';
값 // '제로초'
변수 복사를 바꿔도 배열 값은 바뀌지 않음.
var 배열 = ['a','b','c','d','e'];
var 복사 = 배열;
복사[0] = 'f';
배열 // ['f','b','c','d','e']
변수 복사를 바꾸면 배열값도 바뀜(참조관계)
참조관계를 끊고 싶은 경우,
var obj = {a : 1, b : 2, c : 3}
Object.keys(obj) // ['a','b','c'];
var obj2 = {};
//얕은복사
Object.keys(obj).forEach(function(key){
obj2[key] = obj[key];
});
// 결과확인
obj2 // {a : 1, b : 2, c : 3}
obj2.a = 4;
obj2 // {a : 4, b : 2, c : 3}
obj // {a : 1, b : 2, c : 3}
arr = [1,2,3]
// 얕은복사
arr2 = arr.slice();
// 결과확인
arr2 // [1,2,3]
arr2[0] = 5;
arr2 // [5,2,3]
arr1 // [1,2,3]
var obj3 = JSON.parse(JSON.stringify(obj1)); // 성능 최악
var arr3 = JSON.parse(JSON.stringify(arr1)); // 성능 최악
얕은복사의 경우 1단계까지만 복사가 됨.
만약 {a : 1, b : 2, c : {3, 4}} 의 경우, 객체안에 객체가 있는걸 확인 할 수 있다.
만약 얕은복사를 하게 된다면, 1단계객체들은 복사가 되겠지만, 2단계객체는 참조가 된다.
이럴경우 깊은복사가 필요하다.
var obj = {a : 1, b : 2, c : 3}
var obj2 = {a : 1, b : 2, c : 3}
obj2 === obj // false
var obj = {a : 1, b : 2, c : 3}
obj2 = obj
obj2 === obj // true
일반적으로 객체는 모양이 같아도 false가 뜬다.
참조관계가 되었을 때만 true를 반환하기 때문에 참조인지 아닌지 분별할 수 있다.
참고사이트 : https://www.youtube.com/watch?v=vV6Le05CJ1U&list=PLcqDmjxt30Rtbxbh4eJREOVekql_kWVmu&index=78