
⇒ 기존 원시값을 사용해 새로운 원시값을 생성하는것
// 피연산자가 모두 문자열 타입이어야 하는 문맥
'10' + 2 // '102'
// 피연산자가 모두 숫자 타입이어야 하는 문맥
5 * '10' // 50
// 피연산자 또는 표현식이 불리언 타입이어야 하는 문맥
!0 //true
if(1){ }
자바스크립트 엔진은 개발자의 의도와 다르게 코드의 문맥을 고려해 암묵적으로 타입을 강제 변환할 때가 있다.
문자열 타입으로 변환
1 + '2' // '12'
`1 + 1 = ${1 + 1}` // "1 + 1 = 2"1 - '1' // 0
1 * '10' // 10
1 / 'one' // NaN예제에서 사용한 연산자는 모두 산술 연산자이다.
산술 연산자의 역할은 숫자 값을 만드는 것이다.
산술 연산자의 모든 피연산자는 코드 문맥상 숫자 타입이어야 한다.
자바스크립트 엔진은 산술 연산자 표현식을 평가하기 위해 산술 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다.
피연산자를 숫자 타입으로 변환할 수 없는 경우는 산술 연산을 수행할 수 없으므로 표현식 평가 결과는 NaN이 된다.
피연산자를 숫자 타입으로 변환해야 할 문맥은 산술 연산자뿐만이 아니다.
'1' > 0 // true
비교 연산자의 역할은 불리언 값을 만드는 것이다.
비교 연산자는 피연산자의 크기를 비교하므로 모든 피연산자는 코드 문맥상 숫자 타입이어야 한다.
자바스크립트 엔진은 비교 연산자 표현식을 평가하기 위해 비교 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다.
+단항 연산자는 피연산자가 숫자 타입의 값이 아니면 숫자 타입의 값으로 암묵적 타입 변환을 수행한다.
// 문자열 타입
+'' // 0
+'1' // 1
+'string' // NaN
// 불리언 타입
+true // 1
+false // 0
// null 타입
+null // 0
// undefined
+undefined // NaN
// 심벌 타입
+Symbol() // TypeError
// 객체 타입
+{} // NaN
+[] // 0
+[10, 20] // NaN
+(function(){}) // NaN
빈 문자열, 빈 배열, null, false는 0
true는 1
객체와 빈 배열이 아닌 배열, undefined는 변환되지 않아 NaN이 된다.
if('') console.log(x);if 문이나, for문과 같은 제어문 또는 삼항 조건 연산자의 조건식은 불리언 값으로 평가되어야 하는 표현식이다.
자바스크립트 엔진은 조건식의 평가 결과를 불리언 타입으로 암묵적 타입 변환한다.
if('') console.log('1');
if(true) console.log('2');
if(0) console.log('3');
if('str') console.log('4');
if(null) console.log('5');
// 2 4
자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값(거짓으로 평가되는 값)으로 구분한다.
false로 평가되는 Falsy 값
Falsy 값 외 모든 값은 모드 true로 평가되는 Truthy값이다.
String(1); // '1'
(1).toString(); // '1'
1 + ''; // '1'
Number('1'); // 1
Number(false); // 0
Number(true); // 1
parseInt('0'); // 0
parseFloat('10.53'); // 10.53
+ '0'; // 0
+true; // 1
'0' * 1; // 0
false * 1; // 0
Boolean('x'); // true
Boolean(''); // false
Boolean(0); // false
Boolean(NaN); // fasle
Boolean({}); // true
!!'x'; // true
!!Infinity // true