개발자의 의도와 상관 없이 표현식 평가 도중 JS 엔진에 의해 암묵적으로 타입이 자동 변환되는 것을 의미, type coercion
이라고도 한다.
피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작
-> 나머지 피연산자가 문자열 타입으로 암묵적 타입 변환됨
// 참고
(Symbol()) + '' // TypeError
({}) + '' // [Object object]
Math + '' // [Object Math]
[] + '' // ''
[10, 20] + '' // '10,20'
(function(){}) + '' // function(){}
Array + '' // function Array() { [native code] }
산술 연산자의 특성 상 숫자가 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환함
빈 문자열(
''
), 빈 배열([]
),null
,false
->0
true
->1
객체, 빈 배열이 아닌 배열,undefined
->NaN
if문과 for문과 같은 제어문 또는 삼항 연산자의 조건식의 경우 불리언 값으로 평가되어야 함 -> 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환함
falsy 값(
false
,undefined
,null
,0/-0
,NaN
,''
) ->false
falsy 값을 제외한 나머지 값 ->true
개발자가 의도적으로 값의 타입을 변환하는 것을 의미, type-casting
이라고도 부른다.
String
, Number
, Boolean
)을 new
연산자 없이 호출하는 경우toString
, parseInt/parseFloat
등)암묵적 타입 변환을 이용하는 경우
- 문자열 타입으로 변환하기 위해 문자열 연결 연산자 이용
- 숫자 타입으로 변환하기 위해
+, *
산술 연산자 이용- 불리언 타입으로 변환하기 위해
!
부정 논리 연산자를 두 번 사용
표현식을 평가하는 도중 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 의미한다.
논리곱(&&
) 연산자와 논리합(||
) 연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환한다.
true || anything
-> true
false || anything
-> anything
true && anything
-> anything
false && anything
-> false
?.
)좌항의 피연산자가 null
또는 undefined
인 경우 undefined
를 반환하고 그렇지 않으면 우항의 프로퍼티 참조를 이어감
var str = '';
var length = str && str.length;
console.log(length); // ''
논리곱을 통해 ?.
와 유사하게 구현이 가능하나 좌항이 falsy 값인 0
이나 ''
일 때도 우항이 반환되는데, 0
이나 ''
는 객체로 평가(래퍼 객체)될 때도 있기 때문에 이 경우 ?.
사용이 더 바람직하다.
var str = '';
var length = str?.length;
console.log(length); // 0
??
)좌항의 피연산자가 null
또는 undefined
인 경우 우항의 피연산자를 반환하고 그렇지 않으면 좌항의 피연산자를 반환
var foo = '' || 'default string';
console.log(foo); // 'default string'
논리합을 통해 ??
와 유사하게 구현이 가능하나 만약 falsy 값인 0
이나 ''
도 기본값으로 유효한 경우에는 위와 같이 예기치 않은 동작이 발생할 수 있다. 따라서 이 경우 ??
사용이 더 바람직하다.
var foo = '' ?? 'default string';
console.log(foo); // ''