불리언 타입의 값은 참,거짓을 나타내는 true와 false뿐이다.
주로 조건문에서 사용된다.
var foo = true;
console.log(foo); // true
foo = false;
console.log(foo); // false
undefined 타입의 값은 undefined가 유일하다.
var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화된다.
따라서 값을 할당하지 않은 변수를 참조하면 undefined가 반환된다.
var foo;
console.log(foo); // undefined
변수에 값이 없다고 명시하고 싶을 땐 undefined를 할당하는 것이 아닌 null을 할당해야
혼란스럽지 않다.
null 타입의 값도 마찬가지로 null이 유일하다.
자바스크립트는 대소문자를 구별하므로 null은 Null,NULL등으로 쓰면 안된다.
위에서 말했듯이 null은 변수에 값이 없다는 것을 의도적으로 명시할때 사용된다.
변수에 null을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미로 쓰인다.
var foo = 'Hyeongyu';
foo = null; // 이전 참조를 제거
// 유용하지는 않다. 변수의 스코프를 좁게 만들어 변수 자체를 소멸시키는 편이 효율적이다.
함수가 유효한 값을 반활할 수 없는 경우 명시적으로 null을 반환하기도 한다.
심벌은 ES6에서 추가된 7번째 타입이며, 변경이 불가능한 원시 타입의 값이다.
심벌 값은 다른 값과 중복 되지 않는 유일무이한 값이다.
그러므로 이름이 충돌할 일이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용된다.
심벌 이외의 원시 값은 리터럴을 통해 생성하지만 심벌은 Symbol 함수를 호출해 생성한다.
var key = Symbol('key');
console.log(typeof key); // symbol
var obj = {}; // 객체 생성
obj[key] = 'value'; // 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.
console.log(obj[key]); //value
심벌에 대해서는 33장에서 자세히 살펴볼 수 있다고 한다.
자바스크립트의 데이터 타입은 크게 원시 타입, 객체 타입 두가지로 분류한다.
자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것이 객체다.
지금까지의 6가지 데이터 타입 이외의 값은 모두 객체 타입이다.
객체에 관해서는 11장"원시 값과 객체의 비교"에서 자세히 다룬다고 한다.
var score = 100;
이 코드를 실행하면 컴퓨터는 숫자 값 100을 저장하기 위해 메모리 공간을 확보하고, 확보된 메모리에 숫자 값 100을 2진수로 저장한다. 이러한 처리를 하려면 숫자 값을 저장할 때 확보해야 할 메모리 공간의 크기를 알아야 한다. 자바스크립트 엔진은 데이터 타입의 종류에 따라 정해진 크기의 메모리 공간을 확보한다.
즉, 변수에 할당되는 값의 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정된다는 소리다.
위 예제에서 score는 숫자 타입의 값이다. 따라서 score 변수를 참조하면 메모리 공간의 주소에서 읽어 들인 2진수를 숫자로 해석한다. 예를 들어 2진수 0100 0001을 숫자로 해석하면 65고 문자열로 해석하면 'A'다.
메모리에서 읽어 들인 2진수를 해석하는 방법을 결정하기 위해 데이터 타입이 필요하다.
자바스크립트는 동적 타입 언어다. 그렇다면 C,JAVA 같은 정적 타입의 언어와 차이점이 뭘까?
C,JAVA 에서는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류 , 데이터 타입을 사전에 선언해야 한다.
// C언어 예제
char c; // c변수에는 정수 타입의 값 (-128 ~ 127)만 할당할 수 있다.
int num; // num변수에는 정수 타입의 값(-2,124,283,648 ~ 2,124,483,647)만 할당할 수 있다.
자바스크립트는 정적 타입 언어와 다르게 변수를 선언할때 따로 타입을 선언하지 않는다.
var, let, const 키워드를 사용해 변수를 선언할 뿐이고 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.
정적 타입 언어는 값을 자유롭게 할당할 수는 없지만 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다. 타입 체크를 통과하지 못하면 에러가 발생되고 프로그램 실행 자체를 막는다. 타입의 일관성을 강제함으로써 동적 타입 언어보다 더욱 안정적인 코드 구현으로 런타임에 발생하는 에러를 줄일 수 있다.
var foo;
console.log(typeof foo); // undefined
foo = 3;
console.log(typeof foo); // number
foo = 'Hyeongyu';
console.log(typeof foo); // string
foo = true;
console.log(typeof foo); //boolean
foo = null;
console.log(typeof foo); // object
foo = Symbol();
console.log(typeof foo); // symbol
foo = {}; // 객체
console.log(typeof foo); // object
foo = []; // 배열
console.log(typeof foo); // object
foo = function () {}; // 함수
console.log(typeof foo); // function
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다.
그래도 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
이렇게 동적으로 변할 수 있는 언어를 동적 타입 언어라고 한다.
동적 타입 언어는 유연성은 높지만 신뢰성이 떨어지기 때문에 유의해야 한다.
이웅모.2006.모던 자바스크립트 Deep Dive.위키북스