C나 Java의 경우 정수, 실수 등을 구분하여 int, float, long, double 등 다양한 숫자 타입을 제공한다.
하지만 JS는 실수 단 하나의 숫자 타입만 존재하며, 정수만 표현하기 위한 데이터 타입이 따로 존재하지 않는다.
console.log(1 === 1.0) // true
또한 JS는 2진수, 8진수, 16진수를 표현하기 위한 데이터 타입을 제공하지 않기 때문에 아래와 같은 값을 참조하면 모두 10진수로 해석된다.
추가적으로 Infinity, -Infinity, NaN값 또한 숫자 타입에 속한다.
console.log(1 * 'String'); // Nan
var variable;
그렇다면 변수에 값이 없다는 것을 명시하고 싶을 때는 어떻게 할까?
null 타입의 값은 null이 유일하다.
null은 변수에 값이 없다는 것을 의도적으로 명시할 때 사용한다.
이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하며, JS 엔진은 누구도 참조하지 않는 메모리 공간에 대해 Garbage Collection을 수행할 것이다.
메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기를 결정해야 한다. 이 크기를 결정하는 요소가 바로 데이터 타입이다.
또한 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해 필요하다.
Java, Typescript 같은 정적 타입 언어는 변수를 '선언'할 때 데이터 타입도 같이 선언해야 한다.
반면 JS는 동적 타입 언어로, 데이터 타입을 선언하지 않으며 재할당에 의해 어떠한 데이터 타입의 값이라도 자유롭게 할당이 가능하다.
JS는 값을 선언이 아닌 '할당'하는 시점에 변수의 타입이 동적으로 결정된다.
위의 두 가지 특징을 종합한 것이 '동적 타이핑'이다.
💡 동적 타입 언어는 데이터 타입에 대해 무감각해질 정도로 편리하다!
❓ 그렇다면 요즘 Typescript(정적 언어)가 대세가 되고 있는 이유는 무엇일까? 왜 편리한 동적 타입 언어를 쓰지 않는 것일까?
변수의 타입이 고정되어 있지 않기 때문에 값의 변경에 의해 타입도 언제든지 변경될 수 있다. 따라서 값을 확인하기 전에는 타입을 확신할 수 없다.
또한 JS는 개발자의 의도와는 상관 없이 타입이 자동으로 변환되기도 한다.
이러한 특징으로 볼 때, 동적 타입 언어는 유연성은 높지만 신뢰성이 떨어진다고 할 수 있다.
Javascript Deep Dive 책을 6강까지 읽었다! 지금까지 책은 읽기만 했지 어디간에 정리를 하지 않았었다. 정리가 되니 확실히 이해한 듯한 느낌 + 어디서든 원할 때 다시 읽을 수 있게 되었다! (그리고 이 책 재밌다..!)