- 자바스크립트의 변수는 특정 자료형으로 고정되는 것이 아니라 모든 자료형의 값으로 할당 및 재할당이 가능하다.
<script> let foo = 42 // foo가 숫자 foo = 'bar' // foo가 이제 문자열 foo = true // foo가 이제 불리언 </script>
- 자바스크립트의 변수는 선언된 이후에 다양한 형태로 자료형을 변경할 수 있다.
<script> let foo; console.log(typeof foo); // foo의 자료형은 undefined foo = null; console.log(typeof foo); // foo의 자료형은 object *null의 경우 원시 자료형이지만 '원시적'이지 않은 값을 지닌다. 위의 경우를 모든 object가 null 값에서 파생된다고 말하기도 하고 버그라고 말하기도 한다. foo = 1; console.log(typeof foo); // foo의 자료형은 숫자 foo = '1'; console.log(typeof foo); // foo의 자료형은 문자 foo = true; console.log(typeof foo); // foo의 자료형은 불리언 </script>
==의 경우는 비교되는 대상간의 값을 비교하지만 자료형의 일치 여부까지는 고려하지 않는다.
반면 === 비교연산자의 경우 자료형까지 모두 일치해야 true값을 리턴한다.<script> console.log(1 == '1'); // true console.log(1 === '1'); // false </script>
느슨한 타입의 동적 언어라는 특징을 지니는 자바스크립트는 조건문에서 분기가 필요한 경우 자료형을 고려한 코드의 작성이 필요하다.
이와 관련해서 실제로 겪었던 문제는 db에 있는 데이터를 호출할 때 jsonify형태로 값이 전달되는데 이 때는 숫자 데이터도 문자열로 값을 받게 된다.
이를 고려하지 않고 단순히 숫자로 비교 연산자를 이용한 조건문을 사용할 경우 오류가 발생하게 된다.
비교연산자를 사용하는 경우 ===의 사용이 권장되고 이를 통해 엄격한 비교가 가능해진다.
- 널(null)형
널(null)형은 null 하나의 값만 가질 수 있다.
null 값은 일반적으로 존재하지 않거나 유효하지 않은 객체 또는 주소를 의도적으로 가리키는 참조 값이다.<script> typeof null === 'object' // true </script>
typeof null의 경우 object를 반환하는데 이러한 경우에는 '원시적'이지 않다고도 할 수 있다.
(null형의 자료형은 null이어야 하지만 object로 반환)
위의 경우를 모든 object가 null 값으로 파생된다고 말하기도 하고 버그라고 말하기도 한다.
- undefined형
값이 할당되지 않은 변수는 undefined 상태다.
(선언 자체가 안된 변수는 정의되지 않은 undefined 에러가 나오지만 해당 변수의 값이 아닌 에러명이다.)<script> let x; console.log(x); // undefined </script>
undefined은 변수를 선언하고 값을 할당하지 않은 상태이며 자료형이 없는 상태이다.
null의 경우는 변수를 선언하고 빈 값을 할당한 상태이며 자료형은 object이다.