원시 자료형
: 할당한 변수를 다른 변수에 할당하면 값 자체의 복사가 됨
값 자체가 복사된다고 해서 하나의 값을 변경하더라도 어떤 영향을 끼치지 않음
let num = 5;
let copiedNum = num;
console.log(num); // 5
console.log(copiedNum); // 5
console.log(num === copiedNum); // true
copiedNum = 6;
console.log(num); // 5
console.log(copiedNum); // 6
console.log(num === copiedNum); // false
참조 자료형
: 임의의 저장공간에 값을 저장하고 그 저장공간을 참조하는 주소를 메모리에 저장하기 때문에 다른 변수에 할당할 경우 값 자체가 아닌 메모리에 저장되어 있는 주소가 복사됨
-> 둘 중 하나를 변경하면 해당 변수가 참조하고 있는 주소에 있는 값이 변경되기 때문에 다른 하나에도 영향을 미침
let arr = [0, 1, 2, 3];
let copiedArr = arr;
console.log(arr); // [0, 1, 2, 3]
console.log(copiedArr); // [0, 1, 2, 3]
console.log(arr === copiedArr) // true
copiedArr.push(4);
console.log(arr); // [0, 1, 2, 3, 4]
console.log(copiedArr); // [0, 1, 2, 3, 4]
console.log(arr === copiedArr) // true
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
: spread의 단어 뜻처럼 배열을 펼치 수 있음/ 변수명 앞에 […] 붙여주면 됨
-> 새로운 배열안에 원본 배열을 펼쳐서 전달해도 서로가 다른 주소를 참조하기 때문에 다름
let arr = [0, 1, 2, 3];
console.log(...arr); // 0 1 2 3
let arr = [0, 1, 2, 3];
let copiedArr = [...arr];
console.log(copiedArr); // [0, 1, 2, 3]
console.log(arr === copiedArr); // false
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 : 배열뿐 아니라 객체도 복사 가능
단, 참조 자료형 내부에 참조 자료형이 중첩된 구조는 복사 x → 한단계 까지만 복사가능
let obj = { firstName: "coding", lastName: "kim" };
let copiedObj = {...obj};
console.log(copiedObj) // { firstName: "coding", lastName: "kim" }
console.log(obj === copiedObj) // false
1단계까지만 복사가 되고 1단계 안에 있는 주소값들은 동일한 곳에서 가져온다!!
⇒ 그래서 use와 copiedUsers의 0번째 요소를 각각 비교하면 true가 반환이 된다!
정말 쉬운 챕터가 하나도 없는 것 같은 느낌..
산 넘어 산이다….ㅠㅠ;