[Dev] 참조 복사와 값 복사 (얕은복사와 깊은복사)
깊은복사와 얕은 복사
깊은 복사(자료형의 값 복사)
/*
깊은 복사(자료형의 값 복사)
자바스크립트는 기본자료형( 숫자, 문자, boolean)의 값을 복사할 때 값을 완전히 복사한다.
*/
var a = 100;
var b = a;
a = 200;
console.log( a ) //200
console.log( b ) //100
/*
장점 : 여러 객체가 동시에 수정되는 일이 발생하지 않는다.
단점 : 객체 생성 비용이 비싸며, 메모리를 많이 점유한다.
*/
얕은 복사(객체의 참조 복사)
/*
얕은 복사(객체의 참조 복사)
객체에 변수를 저장하면, 셀자 값을 저장하는 것이 아니라 객체를 메모리 어딘가 만들고 객체의 참조(위치 값)을 저장하게 된다.
따라가 =을 이용하여 복사하면 참조 복사가 가능하다.
*/
var a_arr = [1,2,3,4];
var b_arr = a_arr;
a_arr[0] = 200;
console.log(a_arr) // [200,2,3,4]
console.log(b_arr) // [200,2,3,4]
/*
장점 : 같은 객체를 공유하므로 메로리를 절약, 빠른 장점이 존재
단점 : 두개 이상의 객체가 같은 대상을 가리키고 있기 때문에, 의도치 않게 여러 개의 객체가 동시에 수정될 수 있다.
얕은 복사를 사용하는 이유는?
-> 어차피 두 객체가 같다고 할때 메모리를 절약하기 위해서
*/
/* 특정 객체를 깊은 복사 할경우 는 아래의 방법으로 가능 */
var b_arr = [ ...a_arr ];
var b_obj = { ...a_obj };
var b_obj = JSON.parse( JSON.stringify(a_obj) );
// ex 1 )
var sockets = [];
var socket = {};
var socket2 = {};
console.log(sockets) // []
console.log(socket); // {}
sockets.push(socket);
sockets.push(socket2);
console.log(sockets) // [ {},{} ]
socket["abc"] = "abc";
socket2["abc"] = "abc2";
console.log(sockets)// [ { abc: 'abc' }, { abc: 'abc2' } ]