- 암묵적 타입 변환 : 자바스크립트 엔진에 의해 표현식을 평가하는 도중에 암묵적으로 값의 타입이 자동 변환되는 것
- 명시적 타입 변환 : 개발자가 의도적으로 값의 타입을 변환하는 것
변수의 값 같은 기존 원시 값을 직접 변경하는 것은 아니다. 원시 값은 변경 불가능한 값으로,
타입변환은 기존 원시 값을 사용해 다른 타입의 새로운 원시값을 생성하는 것이다.
1 + '2' // -> "12"
위 예제의 + 연산자는 피연산자 중 하나 이상이 문자열('2'
)이므로 문자열 값을 만드는 문자열 연결 연산자로 동작한다.
자바스크립트 엔진은 문자열 연결 연산자 표현식을 평가하기 위해 문자열 연결 연산자의 피연산자 중에서 문자열 타입이 아닌 피연산자(1
)를 문자열 타입('1'
)으로 압묵적 타입 변환한다.
`1 + 1 = ${1 + 1} // "1 + 1 = 2`
ES6에서 도입된 템플릿 리터럴의 표현식 삽입 역시 평가 결과를 문자열 타입으로 암묵적 타입 변환한다.
1 - '1' // -> 0
1 * 10 // -> 10
1 / 'one' // NaN
산술 연산자의 역할은 숫자 값을 만드는 것으로, 모든 피연산자는 코드 문맥상 모두 숫자타입이어야 한다.
자바스킙트 엔진은 산술 연산자 표현식을 평가하기 위해 산술 연산자의 피연산자 중 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다.
이때 피연산자를 숫자 타입으로 변환할 수 없는 경우는 산술 연산을 수행할 수 없으므로 평가 결과가 NaN이 된다.
'1' > 0 // -> true
비교 연산자의 역할은 불리언 값을 만드는 것으로, 피연산자를 비교하므로 코드의 문맥상 모두 숫자 타입이어야 한다.
자바스크립트 엔진은 비교 연산자 표현식을 평가하기 위해 비교 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다.
if ('') console.log(x);
if문이나 for문과 같은 제어문/삼항 조건 연산자의 조건식은 불리언 값으로 평가되어야 하는 표현식이다. 자바스크립트 엔진은 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환한다.
이때 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy값(참으로 평가되는 값) 또는 Falsy(거짓으로 평가되는 값)값으로 구분한다.
즉, Truthy한 값은true
로, Falsy 값은false
로 암묵적 타입 변환된다.
다음의 falsy 값 외의 모든 값은 모두 true로 평가되는 Truthy값이다.
!!
)하는 방법논리합 또는 논리곱 연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가되는데, 논리 연산자 표현식의 평가 결과는 불리언 값이 아닐 수도 있다.
&&
) 연산자'cat' && 'dog' // -> "dog"
논리곱 연산자는 두 개의 피연산자가 모두 true 평가될 때만 true를 반환하며,
좌항에서 우항으로 평가가 진행되어 두 번째 피연산자가 위 논리곱 연산자 표현식의 평가 결과를 결정한다. 즉, 문자열 'dog'를 반환한다.
||
) 연산자'cat' || 'dog' // -> "cat"
논리합 연산자 역시 좌항에서 우항으로 평가가 진행된다.
그러나 논리합 연산자는 두 개의 피연산자 중 하나만 true로 평가되어도 true를 반환하여, 두 번째 피연산자까지 평가해 보지 않아도 표현식을 평가할 수 있다.
따라서 첫 번째 피연산자 'cat'이 이미 Truthy값이므로 true로 평가되어 'cat'을 반환한다.
이처럼 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환하는 것을 '단축 평가'라 한다. 단축 평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략한다.
이러한 단축 평가를 사용하여 if문을 대체할 수 있다.
var done = true;
ver message = '';
//if (done) message = '완료';
message = done && '완료'
//if (!done) message = '미완료';
message = done || '미완료'
var elem = null;
var value = elem.value; // TypeError: Cannot read property 'value' of null
var elem = null;
// elem이 null이나 undefined와 같은 Falsy 값이면 elem으로 평가되고
// elem이 Truthy 값이면 elem.value로 평가된다.
함수를 호출할 때 인수를 전달하지 않으면 매개변수에는 undefined가 할당된다. 이때 단축 평가를 사용해 매개변수의 기본값을 설정하면 undefined로 인해 발생할 수 있는 에러를 방지할 수 있다.
// 단축 평가를 사용한 매개변수의 기본값 설정
function getStringLength(str) {
str = str || '';
return str.length;
}
getStringLength(); // -> 0
getStringLength('hi'); // -> 2
// ES6의 매개변수의 기본값 설정
function getStringLength(str = '') {
return str.length;
}
getStringLength(); // -> 0
getStringlength('hi'); // -> 2
ES11(ECMAScript2020)에서 도입된 옵셔널 체이닝 연산자 ?.
는 좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
var elem = null;
// elem이 null 또는 undefined이면 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
var value = elem?.value
console.log(value); // undefined
// 문자열의 길이를 참조한다. 이때 좌항 피연산자가 false로 평가되는 Falsy값이라도
// null 또는 undefined가 아니면 우항의 프로퍼티 참조를 이어간다.
var length = str?.length;
console.log(length); // 0
ES11(ECMAScript2020)에서 도입된 null 병합 연산자 ??는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
null 병합 연산자 ??는 변수에 기본값을 설정할 때 유용하다.
// 좌항의 피연산자가 null 또는 undefined이면 우항의 피연산자를 반환하고,
// 그렇지 않으면 좌항의 피연산자를 반환한다.
var foo = null ?? 'default string';
console.log(foo); // default string
null 병합 연산자는 좌항의 피연산자가 false로 평가되는 Fasly 값(false, undefined, null, 0, -0, NaN, ‘’)이라도 null 또는 undefined가 아니면 좌항의 피연산자를 그대로 반환한다.
출처 : 이웅모, 『모던 자바스크립트 deep dive』, 위키북스(2020), p108-123.