원시 자료형
참조 자료형
원시 자료형 | 참조 자료형 |
---|---|
변수에 할당하면 메모리 공간에 값 자체가 저장 | 변수에 할당하면 메모리 공간에 주소값이 저장 |
원시 값을 갖는 변수를 다른 변수에 할당하면 원시 값 자체가 복사되서 전달 | 참조값을 갖는 변수를 다른 변수에 할당하면 주소값이 복사되어 전달 |
변경 불가능한 값(immutable value), 즉 한 번 생성된 원시 자료형은 읽기 전용(read only) 값 | 변경이 가능한 값(mutable value) |
let num = 1; 이라는 변수 할당하고
num = 2; 로 재할당 할 경우 num이라는 변수가 처음 할당된 공간에서 1이 2로 재할당 되는게 아닌 새로운 num으로 새로운 공간을 확보한다. 그 후 재할당 받은 2를 그 공간에 넣어서 num = 2; 로 변경된다. 그 후 num = 1; 이 들어있던 가비지 콜렉터 기능으로 삭제 한다.
*가비지 콜렉터 : 사용하지 않는 값을 자동으로 메모리에서 삭제.
원시 자료형을 할당한 변수를 다른 변수에 할당하면 값 자체의 복사가 일어난다.
= 둘 중 하나의 값을 변경해도 다른 하나에는 영향을 미치지 않는다.
참조 자료형은 값 자체의 복사가 아닌 값이 저장 되있는 주소를 복사한다.
= 변수의 값이 변경되면 두 변수가 참조하고있는 주소의 값이 변경되기 때문에 두 변수 영향을 끼침.
참조 자료형의 경우 원본값의 변경없이 다른 값을 변경하고 싶을때 배열 복사를 한다.
배열을 복사하는 방법 : slice()
spread syntax
slice 메서트
let arr = [0, 1, 2, 3];
let copiedArr = arr.slice();
console.log(copiedArr); // [0, 1, 2, 3]
console.log(arr === copiedArr); // false
spread syntax(변수명 앞에 ...
)
let arr = [0, 1, 2, 3];
let copiedArr = [...arr];
console.log(copiedArr); // [0, 1, 2, 3]
console.log(arr === copiedArr); // false
객체를 복사하는 방법 : Object.assign()
spread syntax
Object.assign()
let obj = { firstName: "coding", lastName: "kim" };
let copiedObj = Object.assign({}, obj);
console.log(copiedObj) // { firstName: "coding", lastName: "kim" }
console.log(obj === copiedObj) // false
spread syntax(변수명 앞에 ...
)
let obj = { firstName: "coding", lastName: "kim" };
let copiedObj = {...obj};
console.log(copiedObj) // { firstName: "coding", lastName: "kim" }
console.log(obj === copiedObj) // false
참조 자료형 내부에 참조 자료형이 중첩되있는 경우에는 중첩 되있는 내부 참조 자료형까지는 복사가 불가능 하다.
참조 자료형 내부에 중첩되어 있는 모든 참조 자료형을 복사한다.
함수가 없을 경우
JSON.stringify()
, JSON.parse()
const arr = [1, 2, [3, 4]];
const copiedArr = JSON.parse(JSON.stringify(arr));
console.log(arr); // [1, 2, [3, 4]]
console.log(copiedArr); // [1, 2, [3, 4]]
console.log(arr === copiedArr) // false
console.log(arr[2] === copiedArr[2]) // false
null
로 바뀌기 때문에 외부 라이브러리 사용함수가 있을 경우
외부라이브러리(lodash
, ramda
)를 사용
const lodash = require('lodash');
const arr = [1, 2, [3, 4]];
const copiedArr = lodash.cloneDeep(arr);
console.log(arr); // [1, 2, [3, 4]]
console.log(copiedArr); // [1, 2, [3, 4]]
console.log(arr === copiedArr) // false
console.log(arr[2] === copiedArr[2]) // false