자바스크립트 자료 타입에는 두가지가 있다
참조형, 기본형
const number = 1; 기본형
const num2 = number; number의 진짜 복사본을 생성하고 그게 num2다. 값 1을 num2에 복사한 것
숫자, 스트링, 불린은 모두 기본형 자료 타입
재할당하거나 변수를 다른 변수에 저장할 때마다 값을 복사한다.
객체와 배열은 참조형 자료 타입
const person = {
name : ‘hyejin’,
}
const secondPerson = person;
객체 person을 복사한 것이 아니고 person 객체 데이터가 저장되어 있는 메모리주소를 가리키는 포인터가 복사된다.
person객체는 메모리에 저장되어 있고, 상수 person에는 데이터가 저장되어 있는 메모리 주소를 가리키는 포인터를 저장
person.name = ‘max’;
console.log(secondPerson);
name : ‘max’ 가 출력됨
secondPerson에 있는 name프로퍼티의 값도 바뀐 것
왜? 주소를 가르키는 포인터를 복사했고, 그 포인터가 가르키는 메모리에 있는 person 데이터 객체를 가리키기 때문이다.
그래서 person.name 을 변경하면 자동적으로 secondPerson.name 도 바뀐다.
그래서 메모리 주소를 가르키는 포인터가 아닌 객체를 복사해야함
스프레드 연산자를 이용해서
const person = {
name : ‘nax’
};
const secondPerson = {…person};
person.name = ‘max’
console.log(secondPerson)
name : ‘max’ 출력됨
포인터가 아닌 진짜 복사본을 생성했기 때문에
재할당(안에 있는 값을 바꾸면)한다면 값이 아닌 포인터를 복사하는 것이고 → 원본이 변경됨
진짜로 복사하고 싶으면
새로운 객체를 생성해서 전체 객체를 복사하는 것이 아니라 그 안에 있는 프로퍼티를 복사해야한다.