- 암묵적 강박 = 유형 강박
- 명시적 강제 = 타이핑
암시적 유형 변환
JavaScript 엔진은 때때로 개발자의 의도와 관계없이 코드의 컨텍스트를 고려하여 식을 평가할 때 데이터 유형을 암시적으로 적용합니다. 암시적 유형 변환은 유형을 문자열, 숫자 및 부울과 같은 기본 유형 중 하나로 자동 변환합니다.
– 문자열 형식으로 변환
문자열 연결 연산자 식을 평가하기 위해 JavaScript 엔진은 문자열 연결 연산자의 피연산자 중에서 비문자열 유형의 피연산자를 문자열 유형으로 암시적으로 캐스팅합니다.
1 + '2' // '12'
`1 + 1 = ${1 + 1}` // '1 + 1 = 2'
문자열이 아닌 유형 값에서 문자열 유형으로 암시적 유형 변환을 수행할 때 JavaScript 엔진은 다음과 같이 작동합니다.
// 숫자 타입
0 + '' // '0'
-0 + '' // '0'
1 + '' // '1'
-1 + '' // '-1'
NaN + '' // 'NaN'
Infinity + '' // 'Infinity'
-Infinity + '' // '-Infinity'
// 불리언 타입
true + '' // 'true'
false + '' // 'false'
// null 타입
null + '' // 'null'
// undefined 타입
undefined + '' // 'undefined'
// 심벌 타입
(Symbol()) + '' // TypeError: Cannot convert a Symbol value to a string
// 객체 타입
({}) + '' // '(object Object)'
Math + '' // '(object Math)'
() + '' // ''
(10, 20) + '' // '10, 20'
(function(){}) + '' // 'function(){}'
Array + '' // 'function Array() { (native code) }'
– 숫자형으로 변환
산술 연산자의 피연산자 사이에서 숫자가 아닌 유형을 숫자 유형으로 암시적으로 캐스트합니다.
피연산자를 숫자 유형으로 변환할 수 없는 경우 표현식 평가 결과는 NaN입니다.
상황에 따라 모든 피연산자는 숫자 유형이어야 하므로 관계 연산자는 숫자 유형으로의 암시적 유형 변환도 수행합니다.
1 - '1' // 0
1 * '10' // 10
1 / 'one' // NaN
'1' > 0 // true
// 문자열 타입
+'' // 0
+'0' // 0
+'1' // 1
+'string' // NaN
// 불리언 타입
+true // 1
+false // 0
// null 타입
+null // 0
// undefined 타입
+undefined // NaN
// 심벌 타입
+Symbol() // TypeError: Cannot convert a Symbol value to a number
// 객체 타입
+{} // NaN
+() // 0
+(10, 20) // NaN
+(function(){}) // NaN
– 불리언 타입으로 변환
if 문, for 문 또는 삼항 조건 연산자의 조건식 평가 결과와 같은 제어 문의 암시적 형식 변환을 Boolean 형식으로 변환합니다.
부울이 아닌 값을 논리(참으로 평가되는 값) 또는 거짓(거짓으로 평가되는 값)으로 분류합니다.
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
/*
'' = false
true = true
0 = false
'str' = true
null = false
*/
*false로 평가되는 false 값
(False 값을 제외한 모든 값이 true로 평가되는 Boolean 값)
- 잘못된
- 정의되지 않음
- 영
- 0, -0
- NaN
- ”(빈 문자열)
명시적 유형 변환
개발자의 의도에 따라 유형을 명시적으로 변환하는 것을 말합니다.
new 연산자 없이 표준 내장 생성자 함수(String, Number, Boolean)를 호출하거나 내장 메소드를 사용하거나 의도적으로 암시적 유형 변환을 사용하는 등의 메소드가 있습니다.
– 문자열 형식으로 변환
1. new 연산자 없이 문자열 생성자 함수를 호출하는 방법
2. Object.prototype.toString 메서드 사용
3. 문자열 연결 연산자 사용 방법
// 1. String 생성자 함수를 new 연산자 없이 호출하는 방법
// 숫자 타입 => 문자열 타입
String(1); // '1'
String(NaN); // 'NaN'
String(Infinity); // 'Infinity'
// 불리언 타입 => 문자열 타입
String(true); // 'true'
String(false); // 'false'
// 2. Object.prototype.toString 메서드를 사용하는 방법
// 숫자 타입 => 문자열 타입
(1).toString(); // '1'
(NaN).toString(); // 'NaN'
(Infinity).toString(); // 'Infinity'
// 불리언 타입 => 문자열 타입
(true).toString(); // 'true'
(false).toString(); // 'false'
// 3. 문자열 연결 연산자를 이용하는 방법
// 숫자 타입 => 문자열 타입
1 + ''; // '1'
NaN + ''; // 'NaN'
Infinity + ''; // 'Infinity'
// 불리언 타입 => 문자열 타입
true + ''; // 'true'
false +''; // 'false'
– 숫자형으로 변환
1. new 연산자 없이 Number 생성자 함수를 호출하는 방법
2. parseInt 및 parseFloat 함수 사용(문자열만 숫자 유형으로 변환 가능)
3. 단항 산술 연산자 사용 +
4. 산술 연산자 사용 *
// 1. Number 생성자 함수를 new 연산자 없이 호출하는 방법
// 문자열 타입 => 숫자 타입
Number('0'); // 0
Number('-1'); // -1
NUmber('10.53'); // 10.53
// 불리언 타입 => 숫자 타입
Number(true); // 1
Number(false); // 0
// 2. parseInt, parseFloat 함수를 사용하는 방법(문자열만 변환 가능)
// 문자열 타입 => 숫자 타입
parseInt('0'); // 0
parseInt('-1'); // -1
parseFloat('10.53'); // 10.53
// 3. + 단항 산술 연산자를 이용하는 방법
// 문자열 타입 => 숫자 타입
+'0'; // 0
+'-1'; // -1
+'10.53'; // 10.53
// 불리언 타입 => 숫자 타입
+true; // 1
+false; // 0
// 4. * 산술 연산자를 이용하는 방법
// 문자열 타입 => 숫자 타입
'0' * 1; // 0
'-1' * 1; // -1
'10.53' * 1; // 10.53
// 불리언 타입 => 숫자 타입
true * 1; // 1
false * 1; // 0
– 불리언 타입으로 변환
1. new 연산자 없이 부울 생성자 함수를 호출하는 방법
2위! 부정 논리 연산자를 두 번 사용하는 방법
// 1. Boolean 생성자 함수를 new 연산자 없이 호출하는 방법
// 문자열 타입 => 불리언 타입
Boolean('x'); // true
Boolean(''); // false
Boolean('false'); // true
// 숫자 타입 => 불리언 타입
Boolean(0); // false
Boolean(1); // true
Boolean(NaN); // false
Boolean(Infinity); // true
// null 타입 => 불리언 타입
Boolean(null); // false
// undefined 타입 => 불리언 타입
Booleadn(undefined); // false
// 객체 타입 => 불리언 타입
Boolean({}); // true
Boolean(()); // true
// 2. ! 부정 논리 연산자를 두 번 사용하는 방법
// 문자열 타입 => 불리언 타입
!!'x'; // true
!!''; // false
!!'false'; // true
// 숫자열 타입 => 불리언 타입
!!0; // false
!!1; // true
!!NaN; // false
!!Infinity // true
// null 타입 => 불리언 타입
!!null; // false
// undefined 타입 => 불리언 타입
!!undefined; // false
// 객체 타입 => 불리언 타입
!!{}; // true
!!(); // true