JavaScript는 느슨한 타입(loosely typed)의 동적(dynamic) 언어이다. JavaScript의 변수는 어떤 특정과 연결되지 않으며, 모든 타입의 값으로 할당 (및 재할당) 가능하다.
let foo = 42 // foo가 숫자
foo = 'bar' // foo가 이제 문자열
foo = true // foo가 이제 불리언
이처럼 자료의 타입은 있지만 변수에 저장되는 값의 타입은 언제든지 바꿀 수 있는 언어를 ‘동적 타입(dynamically typed)’ 언어라고 부른다.
함수와 연산자에 전달되는 값은 대부분 적절한 자료형(타입)으로 자동 변환된다. 이런 과정을 '형 변환(type conversion)'이라고 한다.
문자, 숫자, 논리형으로의 형 변환은 자주 일어나는 형 변환이다.
문자형으로 변환은 무언가를 출력할 때 주로 일어난다.
String(value)을 사용하면 문자형으로 명시적 변환이 가능하다. 원시 자료형을 문자형으로 변환할 땐, 대부분 그 결과를 예상할 수 있을 정도로 명시적인 방식으로 일어난다.
숫자형으로 변환은 수학 관련 연산시 주로 일어난다.
Number(value)로도 형 변환을 할 수 있다.
숫자형으로의 변환은 다음 규칙을 따른다.
전달받은 값 | 형 변환 후 |
---|---|
undefinded | NaN |
null | 0 |
true / false | 1 / 0 |
String | 전달받은 문자열을 '그대로'읽되, 처음과 끝의 공백을 무시한다, 그리고 숫자형으로 반환함. 문자열이 비어있다면 0이 되고, 오류 발생 시 NaN(예 '123a')가 된다. |
불린형으로 변환은 논리 연산 시 발생
Boolean(value)으로도 변환할 수 있다.
0, null, undefinde, NaN, "" => false
그 외의 값 => true
** 주의 사항
동등 연산자는 형이 다른 피연산자를 비교할 때 피연산자를 숫자형으로 바꾸는데 여기에서 문제가 발생한다.
아래의 코드를 보면 동등 연산자는 형이 다른 두 값을 true로 반환한다.
alert( 0 == false ); // true
alert( '' == false ); // true
일치 연산자(strict equality operator) ===를 사용하면 형 변환 없이 값을 비교할 수 있다.
일치 연산자는 엄격한 동등 연산자이다. 자료형의 동등 여부까지 검사하기 때문에 피연산자 a와 b의 형이 다를 경우 a === b 는 즉시 false를 반환한다.
alert( 0 === false ); // false, 피연산자의 형이 다르기 때문
일치 연산자 ===가 동등 연산자 ==의 엄격한 버전인 것처럼 ‘불일치’ 연산자 !==는 부등 연산자 !=의 엄격한 버전이다.
일치 연산자 ===를 사용하여 null과 undefined를 비교
두 값의 자료형이 다르기 때문에 일치 비교 시 거짓이 반환
alert( null === undefined ); // false
동등 연산자 ==를 사용하여 null과 undefined를 비교
동등 연산자를 사용해 null과 undefined를 비교하면 특별한 규칙이 적용돼 true가 반환된다. 동등 연산자는 null과 undefined를 '각별한 커플’처럼 취급한다. 두 값은 자기들끼리는 잘 어울리지만 다른 값들과는 잘 어울리지 못한다.
alert( null == undefined ); // true
동등 연산자 ==는 피연산자가 undefined나 null일 때 형 변환을 하지 않습니다. undefined와 null을 비교하는 경우에만 true를 반환하고, 그 이외의 경우(null이나 undefined를 다른 값과 비교할 때)는 무조건 false를 반환