동적 타이핑
c나 자바같은 정적 타입 언어는 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다.
이를 명시적 타입 선언 이라 한다.
// c변수에는 1 바이트 정수 타입의 값 (-128 - ~127) 만 할당할 수 있다.
char c;
정적 타입 언어는 변수 변경할 수 없으며 변수에 선언힌 타입에 맞는 값만 할당할 수 있다.
정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행,
만약 타입 체크를 통과하지 못했다면 에러를 발생시키고 프로그램의 실행 자체를 막아 안정적인 코드의 구현을 통해
런타임에 발생하는 에러를 줄인다.
하지만!
자바스크립트는 정적 타입 언어와 다르게 변수를 선언할 때 타입을 선언하지 않는다. 다만 var, let , const 키워드를 사용해
변수를 선언할 뿐이다.
자바스크립트의 변수느니 정적 타입 언어와 같이 미리 선언한 데이터 타입의 값만 할당할 수 있는 것이 아니다.
어떤 타입의 값이라도 자유롭게 할당할 수 있다.

typeof 연산자로 변수를 연산하면 변수의 데이터 타입을 반환한다. 정확히는 변수의 데이터 타입을 반환이 아닌
변수에 할당된 값의 데이터 타입을 반환한다.
자바스크립트의 변수에는 어떤 데이터 타입의 값이라도 자유롭게 할당할 수 있으므로 정적 타입 언어에서 말하는
데이터 타입과 개념이 다르다. 정적 타입 언어는 변수 선언 시점에 변수의 타입이 결정되고 변수의 타입을 변경 불가능하다.
자바스크립트에서는 값을 할당하는 시점에 변수의 타입이 동적으로 결정되고 변수의 타입을 언제든지 자유롭게 변경할 수 있다.
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정!(타입 추론) 된다. 그리고
재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
자바 스크립트는 이렇게 동적으로 변할 수 있는 변수를 사용하기 때문에 정적 언어보다 위험성이 높다.
그렇기 때문에 const 키워드를 사용한 변수를 선언하여 값이 나도 모르는 사이 변하는 것을 막고,
변수를 선언할때 변수의 사용하는 이름으로 해당 변수가 어떤 값을 가지고 있는지에 대한 정보를 알 수 있게끔
작성하는 것이 중요하다고 생각한다.
출처
책: 모던 자바스크립트 Deep Dive