기본형 - string, number, boolean, null, undefined, Symbol(ES6), ...
참조형 - object, array, function, date, regexp, Map, WeakMap, Set, WeakSet, ...
비트 - 0 또는 1만 표현할 수 있는 하나의 메모리 조각이다.
바이트 - 8깨의 비트로 구성되어 1바이트가 된다.
숫자의 경우 부동소수형인지 정수형인지 구분하지 않고 64비트(8바이트)의 메모리 공간을 확보한다.
각 비트는 고유한 식별자를 갖는다. -> 식별자로 비트의 위치를 확인한다.
바이트 역시 시작하는 비트의 식별자로 위치를 파악한다.
모든 데이터는 바이트 단위의 식별자, 정확하게는 메모리 주솟값 을 통해 서로 구분하고 연결한다.
변수 - 변할 수 있는 무언가 여기서 '무언가'는 데이터를 말한다. (변경 가능한 데이터가 담길 수 있는 공간 또는 그릇)
식별자 - 어떤 데이터를 식별하는데 사용하는 이름이다. 즉, 변수명이다.
변수와 상수를 구분하는 성질은 '변경 가능성'이다. 한 번 데이터 할당이 이뤄진 변수에 재할당 여부가 관건이다.
기본형 데이터인 숫자, 문자열, boolean, 등 모두 불변값이다.
참조형 데이터는 가변값이다? -> X!!!!
기본형 데이터와의 차이는 '객체의 변수(프로퍼티)영역'이 별도로 존재한다.
변수에는 다른값을 얼마든지 대입할 수 있다. 객체의 변수의 값을 변경할 수 있기 때문에 가변값이라고들 한다.
const obj = {
a: 1,
arr: [3, 4, 5],
};
const obj2 = obj; // 복사를 한다.
consol.log(obj === obj2) // true
obj2.arr = 7;
obj.arr === obj2.arr // true
console.log(obj.arr) // 7
console.log(obj2.arr) //7
이런식으로 객체의 프로퍼티 값을 변경할 수 있어 가변값이라고 한다.
여기서 문제는 객체의 복사본이든 원본이든 프로퍼티를 변경하면 둘 다 변경된다는 것이다.
데이터 자체를 변경하고자하면 기본형과 마찬가지로 기존 데이터는 변하지 않는다.
아래코드를 통해 확인하자
const user = {
name: 'BigOne',
gender: 'male',
}
const changeName = function (user, newName) {
const newUser = user;
newUser.name = newName;
return newUser;
}
const user2 = changeName(user, 'silverCenter');
console.log(user === user2) // true
console.log(user.name, user2.name) // silverCenter silverCenter
객체의 가변성에 따른 문제점이다. 불변값으로 만들어 해결하면 된다.
const user = {
name: 'BigOne',
gender: 'male',
}
const changeName = function (user, newName) {
return {
name: newName,
user.gender,
}
}
const user2 = changeName(user, 'silverCenter');
console.log(user2 === user) // false
console.log(user2.name, user.name) // silverCenter, BigOne
changeName 함수가 새로운 객체를 반환하게 하면 불변성을 지키게된다.
참조형 데이터가 '가변값'이라고 설명할 때의 '가변' 이란 참조형 데이터 자체를 변경하는 경우가 아니라 객체 내부의 프로퍼티를 변경할 경우에만 성립한다.