
데이터 타입
1-1 데이터 타입의 종류
- 기본형(원시형) - 숫자, 문자열, 불리언, null, undefined, 심볼(ES6)
- 참조형 - 객체, 배열, 함수, 날짜, 정규표현식, ES6(Map, WeakMap, Set, WeakSet…)
- 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제
1-2 데이터 타입에 관한 배경지식
1-2-1 메모리와 데이터
- 메모리: 매우 많은 비트들로 구성
- 각 비트는 고유한 식별자를 통해 위치를 확인할 수 있음 →비트 단위로 위치를 확인하는 것은 비효율적 → 몇 개씩 묶어 하나의 단위로 여긴다면 표현 가능한 값도 늘고 검색시간도 줄일 수 있음
- 다만, 낭비되는 비트가 생기기도 함
- 제약이 생기더라도 크게 문제가 되지 않을 적정한 공간을 묶는 것이 나음 → 바이트의 탄생
- JS는 과거에 비해 메모리가 월등히 커진 상황에서 등장 → 메모리 관리에 대한 압박이 ⬇️
- 정수형인지 부동소수형인지 구분하지 않고 64비트(8바이트)를 확보함.
- 문자는 정해져 있지 않다(쵸파의 의견)
- 메모리 주솟값을 통해 서로 구분하고 연결 할 수 있음
1-2-2 식별자와 변수
- 변수: 변할 수 있는 수 (변할 수 있는 무언가 == 데이터)
- 식별자: 변수명(어떤 데이터를 식별하는데 사용하는 이름)
1-3 변수 선언과 데이터 할당
1-3-1 변수 선언
- 변수: 변경 가능한 데이터가 담길 수 있는 공간(그릇)
1-3-2 데이터 할당
- 왜 변수 영역에 값을 직접 대입하지 않고 굳이 번거롭게 한 단계를 더 거칠까?
- 데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효율적으로 관리하기 위함
- 새로운 값을 대입할 때 별도의 공간에 데이터를 저장하고 그 주소를 변수 공간에 연결
1-4 기본형 데이터와 참조형 데이터
1-4-1 불변값
- 변수와 상수를 구분하는 성질은 변경 가능성.
- 위의 상황에서 변경 가능성의 대상은 변수 영역 메모리 → 한번 데이터 할당이 이뤄진 변수 공간에 다른 데이터 재할당이 가능한지
- 불변성 여부를 구분할 때 변경 가능성 대상은 데이터 영역의 메모리
- 기본형은 모두 불변값
- 변경은 새로 만드는 동작을 통해서만 이루어진다.
1-4-2 가변값
- 참조형 데이터의 기본적인 성질은 가변값인 경우가 많지만 설정에 따라 변경 불가능 한 경우도 있고, 불변값으로 활용하는 방안도 있다.
- 기본형과 달리 ‘객체의 변수 영역’이 별도로 존재
- 객체가 별도로 할애한 영역은 변수 영역, 데이터 영역은 기존의 메모리 공간 활용
- 데이터 영역에 저장된 값은 불변값, 변수에는 다른 값을 얼마든지 대입가능
- 중첩 객체 - 참조형 데이터의 프로퍼티에 다시 참조형 데이터를 할당하는 경우
- 참조 카운트 - 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수
- 참조 카운트가 0인 메모리 주소는 가비지 컬렉터의 수거 대상
1-4-3 변수 복사 비교
- 기본형은 주솟값을 복사하는 과정이 한 번만 이뤄지고, 참조형은 한 단계를 더 거치게 된다.
- 참조형 데이터가 가변값이라고 설명할 때의 가변은 참조형 데이터 자체를 변경할 경우가 아닌 그 내부의 프로퍼티를 변결할 때만 성립
1-5 불변 객체
1-5-1 불변 객체를 만드는 방법
- 불변 객체가 필요한 경우 : 값으로 전달받은 객체에 변경을 가하더라도 원본 객체는 변하지 않아야하는 경우
- 서로 합의 하고 규칙을 지킨다는 전제에선 불변 객체지만, 인간을 믿을 수 없다
- → 라이브러리가 등장(불변성을 지닌 별도의 데이터 타입과 그에 따른 메서드 제공)
1-5-2 얕은 복사와 깊은 복사
- 얕은 복사: 바로 아래 단계의 값만 복사
- 중첩된 객체에서 참조형 데이터가 저장된 프로퍼티를 복사할 때 그 주솟값만 복사
- →해당 프로퍼티에 대해 원본과 사본이 모두 동일한 참조형 데이터의 주소를 가리킴
- 깊은 복사: 내부의 모든 값들을 하나하나 찾아서 전부 복사
- 객체를 복사할 때 프로퍼티가 기본형 데이터일 경우 그대로 복사, 참조형 데이터는 다시 그 내부의 프로퍼티를 복사
1-6 undefined와 null
- undefined: 사용자가 명시적으로 지정할 수도 있지만 JS엔진이 자동으로 부여하는 경우도 있음
- JS 엔진은 사용자가 값을 지정할 것이라고 예상되는 상황에 그러지 않으면 undefined
- 값을 대입하지 않은 변수
- 객체 내부의 존재하지 않는 프로퍼티를 접근하려고 할 때
- return 문이 없거나 호출되지 않는 함수의 실행결과
- 사용자가 부여한 경우 실존하는 데이터, JS엔진이 반환해주는 경우 말그대로 값이 없음.
- 배열의 경우 조금 특이함
- 비어있는 요소와 undefined를 할당한 요소는 다르다
- 비어있는 요소는 순회와 관련된 많은 배열 메서드들의 순회에서 제외
- 배열도 객체이기 때문에 존재하지 않는 프로퍼티에 대해서 순회 할 수 없다.
- 비어있음을 명시적으로 나타내고 싶을 때는 null을 사용
- typeof null이 object인데 이건 그냥 버그이다.
- undefined와 null을 구분하고 싶다면 일치연산자(===) 사용