데이터 저장 방식에서 차이점이 발생.
let a = 1;
function func(b){
b = 2;
}
func(a);
console.log(a); // 1
let a = {
first : 'abc',
second : 55
}
function func(b){
b.second = 2;
}
func(a);
console.log(a); // 2
두 예시에서 왜 각각의 데이터가 저장되는 방식이 다른가?
기본형(Primitive) 타입 - Number, String, Boolean, undefined, null, ES6에서 추가된 Symbol.
참조형(Reference) 타입 - Object, Array, Function, Date, RegExp, ES6에서 추가된 Map, WeakMap, Set, WeakSet.

각각의 공간은 주소를 가지고 있다.
let x = 1;
let y = 2;
let z = x;

let x = 1;
let y = 2;
let z = x;
x = 3;


가비지 컬렉터(Garbage Collector, GC)라는 것이 있다.
메모리가 부족해지는 등 특정 시점이 되면 참조 카운트가 0인 수거 대상들을 비우는 역할을 한다.
let a = {
first : 'abc',
second : 55
}

객체의 속성들을 담은 데이터 그룹이 시작하는 주소(@3001~)를 가리키고 있다.
let a = {
first : 'abc',
second : 55
}
function func(b){
b.second = 2;
}
func(a);
console.log(a)

변수 a와 b는 모두 뿌리가 같은 @2001을 가리키므로 이러한 변화는 두 변수 모두에게 영향을 미치게 된다.
원 배열 a 와 복사된 배열 b 중 어느 하나를 수정하는 상황이 닥칠 때, 얕은 복사 a = b 를 한 경우 같은 주소를 가리키는 탓에 둘 모두가 변화한다.
그러나 깊은 복사를 하면 a를 수정하는 경우에는 a만, b를 수정하는 경우에는 b만 변화한다.