심벌(symbol)은 ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값이다. 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다. 따라서 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.
심벌 이외의 원시 값은 리터럴을 통해 생성하지만 심벌은 Symbol 함수를 호출해 생성한다. 이때 생성된 심벌 값은 외부에 노출되지 않으며, 다른 값과 절대 중복되지 않는 유일무이한 값이다.
// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key); // symbol
// 객체 생성
var obj = {};
// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.
obj[key] = 'value';
console.log(obj[key]); // value
메모리의 주소에 저장된 2진수를 원하는 리터럴로 해석하기 위해서는 데이터 타입이 정해져야 한다.
예시) 만약 0x000001를 숫자로 해석하면 1, 문자로 해석하면 a가 될 수도 있다.
문자열, 숫자 등에 따라 사용하는 메모리의 크기가 다르기 때문에 데이터 타입을 통해 한번에 읽어야하는 메모리 셀의 크기를 추정한다.
컴파일러 또는 인터프리터는 심볼 테이블이라는 자료구조를 통해 식별자를 키로 바인딩된 값의 메모리 주소, 데이터 타입, 스코프 등을 관리한다.
선언이 아닌, **할당으로 타입이 결정(타입 추론)**되는 자바스크립트는 이러한 심볼 테이블을 통해 변수의 타입이 언제든 동적으로 변한다. 이를 동적 타입 언어라 한다.
동적타입 언어는 유연성은 높지만 신뢰성이 떨어진다.

+로 문자열과 이외 타입을 연결하면 문자열로 변경된다. 이를 암묵적 타입 변환, 타입 강제변환이라 한다.
+, - 연산자를 사용한 암묵적 타입 변환
숫자 타입이 아닌 피연산자에 + 단항 연산자를 사용하면 피연산자를 숫자 타입으로 변환하여 반환한다.
ex) const a = +’3’ // typeof a === 'number'
5 == '5' // true;
5 === '5' // false; // 타입과 값을 함께 비교한다.
하지만, NaN은 강한 비교를 해도 유일하게 자신과 일치하지 않는 유일한 값이다. 따라서 NaN을 파악하기 위해서는 Number.isNaN() 함수나 Object.is() 함수를 사용해야 한다.