const x = 10; // number
const str = x.toString(); // string
const x = 10; //number
const str = x + ''; // string
명시적 타입변환, 암묵적 타입 변환 모두 기존 원시 값을 직접 변경하는 것은 아니고 기존 원시 값을 이용해 다른 타입의 새로운 원시 값을 생성하는 것이다.
이때, 변수에 다른 타입 값을 재할당 하는 것이 아닌 표현식 평가를 할 때 한번 사용하고 버린다.
1 + '2' // '1' + '2' -> '12'
여기서 +
는 피연산자가 문자열 하나이상을 포함하고 있기 때문에 문자열 연결 연산자
로 동작한다. 문자열 연결 연산자는 모든 피연산자를 모두 문자열 타입으로 변경시키기때문에 암묵적 타입 변환한다.
1 - '1' // 0
1 * '10' // 10
1 / 'one' // NaN
여기서 사용한 연산자는 모두 산술 연산자이다. 산술연산자의 피연산자는 모두 number 타입이기때문에 피연산자를 모두 number타입으로 변환한다.
'1' > 0 // true
비교 연산자도 피연산자의 크기를 비교하므로 모든 피연산자는 숫자 타입이여야 하기때문에 number로 변환한다.
+
단항 연산자도 숫자가 아니면 숫자 탕비으로 암묵적 타입 변환을 한다.
if ('') console.log(x);
if문 조건식은 무조건 불리언 타입이어야되기 때문에 암묵적 타입 변환한다.
이때 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy
또는 Falsy
로 구분한다.0
, ''
, null
, undefined
등의 값은 Falsy한 값이기 때문에 거짓으로 분류된다.
String()
)Object.prototype.toString()
String(1); // '1'
true.toString() // 'true'
1 + '';
Number()
)parseInt
, parseFloat
함수 사용 (문자열만 변환 가능)Number(true) // 1
parseInt('1') // 1
parseFloat('1.23') //1.23
+'0' // 0
'0' * 1 // 0
Boolean('x'); // true
!!'x'; // true
!!0; //false
||
) 또는 논리곱 (&&
)은 2개의 피연산자 중 어느 한쪽으로 평가되어 반환하기 때문에 이를 이용해 단축평가를 할 수 있다.'Cat' && 'Dog' // 'Dog'
첫번째 피연산자인 'Cat'
은 Truthy하기 때문에 true로 평가된다. 그러나&&
연산자는 두개의 피연산자 모두 true여야하기 때문에 두번째 피연산자까지 평가해 보아야 위 표현식을 평가할 수 있다.
-> 두번째 피연산자가 논리곱 연산자 표현식의 평가 결과를 결정한다. 이떄 논리곱 연산자는 논리 연산의 결과를 결정하는 두 번째 피연산자. 'Dog'
을 그대로 반환한다.
||
연산자도&&
과 마찬가지로 동작한다. 다만 논리합 연산자는 맨 앞의 것으로 해당 연산자의 결과가 평가되기 때문에 첫번째 피연산자인'Cat'
을 반환한다.
'Cat' || 'Dog' // 'Cat'
false || 'Dog' // 'Dog'
'Cat' || false // 'Cat'
'Cat' && 'Dog' // 'Dog'
false && 'Dog' // false
'Cat' && false // false
?.
)const a = null;
const value = a?.value; // ?가 없었으면 에러가 났을 것이지만 옵셔널 체이닝의 경우 undefined를 반환하기 때문에 에러가 나지 않는다.
console.log(value); // undefined
null
, undefined
일때만 undefined를 반환하기때문에 그대로 우항의 프로퍼티 참조를 이어간다.const str = '';
const length = str?.length;
console.log(length) // 0
??
)const foo == null ?? 'defualt' // foo === 'default'