[JS] javaScript Study 09
09장 타입 변환과 단축 평가
9.1 타입 변환이란?
- 개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환 또는 타입 캐스팅이라 한다.
- 개발자의 의도와는 상관없이 표현식을 평가하는 도중에 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되는 것을 암묵적 타입 변환 또는 타입 강제 변환이라 한다.
9.2 암묵적 타입 변환
- 문자열 타입으로 변환
-
ES6에 도입된 템플릿 리터럴의 표현식 삽입
`1 + 1 = ${1 + 1}` // -> "1 + 1 = 2" -
문자열 타입 아닌 값을 문자열 타입으로 암묵적 타입 변환을 수행할 때 다음과 같이 동작
// 숫자 타입 1 + '' // '1' NaN = '' // 'NaN' // 불리언 타입 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] }"
-
-
숫자 타입으로 변환
// 문자열 타입 +'' // -> 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 - 불리언 타입으로 변환
- 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값(거짓으로 평가되는 값)으로 구분한다.
- 제어문의 조건식과 같이 불리언 값으로 평가되어야 할 문맥에서 Truthy 값은 true로, Falsy 값은 false로 암묵적으로 타입 변환된다.
- false로 평가되는 Falsy 값
- false
- undefined
- null
- 0, -0
- NaN
- ‘ ‘(빈 문자열)
- Falsy 값 외의 모든 값은 모두 true로 평가되는 Truthy 값
-
다음 예제는 Truthy/Falsy 값을 판별하는 함수다.
// 전달받은 인수가 Falsy 값이면 true, Truthy 값이면 false를 반환한다. function isFalsy(v) { return !v; } // 전달받은 인수가 Truthy 값이면 true, Falsy 값이면 false를 반환한다. function isTruthy(v) { return !!v; } // 모두 true를 반환한다. isFalsy(false); isFalsy(undefined); isFalsy(null); isFalsy(0); isFalsy(NaN); isFalsy(''); // 모두 true를 반환한다. isTruthy(true); isTruthy('0'); // 빈 문자열이 아닌 문자열을 Truthy 값이다. isTruthy({}); isTruthy([]);
- 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값(거짓으로 평가되는 값)으로 구분한다.
9.3 명시적 타입 변환
- 문자열 타입으로 변환
-
String 생성자 함수를 new 연산자 없이 호출하는 방법
// 숫자 타입 => 문자열 타입 String(1); // -> "1" String(NaN); // -> "NaN" String(Infinity); // -> "Infinity" // 불리언 타입 => 문자열 타입 String(true); // -> "true" String(false); // -> "false" -
Object.prototype.toString 메서드를 사용하는 방법
// 숫자 타입 => 문자열 타입 (1).toString(); // -> "1" (NaN).toString(); // -> "NaN" (Infinity).toString(); // -> "Infinity" // 불리언 타입 => 문자열 타입 (true).toString(); // -> "true" (false).toString(); // -> "false" -
문자열 연결 연산자를 이용하는 방법
// 숫자 타입 => 문자열 타입 1 + ''; // -> "1" NaN + ''; // -> "NaN" Infinity + ''; // -> "Infinity" // 불리언 타입 => 문자열 타입 true + ''; // -> "true" false + ''; // -> "false"
-
- 숫자 타입으로 변환
-
Number 생성자 함수를 new 연산자 없이 호출하는 방법
// 문자열 타입 =>숫자 타입 Number('0'); // -> 0 Number('-1'); // -> -1 Number('10.53'); // -> 10.53 // 불리언 타입 => 숫자 타입 Number(true); // -> 1 Number(false); // -> 0 -
parseInt, parseFloat 함수를 사용하는 방법(문자열만 숫자 타입으로 변환 가능)
// 문자열 타입 =>숫자 타입 parseInt('0'); // -> 0 parseInt('-1'); // -> -1 parseFloat('10.53'); // -> 10.53 -
- 단항 산술 연산자를 이용하는 방법
// 문자열 타입 =>숫자 타입 +'0'; // -> 0 +'-1'; // -> -1 +'10.53'; // -> 10.53 // 불리언 타입 => 숫자 타입 +true; // -> 1 +false; // -> 0 -
- 산술 연산자를 이용하는 방법
// 문자열 타입 =>숫자 타입 '0' * 1; // -> 0 '-1' * 1; // -> -1 '10.53' * 1; // -> 10.53 // 불리언 타입 => 숫자 타입 true * 1; // -> 1 false * 1; // -> 0
-
- 불리언 타입으로 변환
-
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 타입 => 불리언 타입 Boolean(undefined); // -> false // 객체 타입 => 불리언 타입 Boolean({}); // -> true Boolean([]); // -> true -
! 부정 논리 연산자를 두 번 사용하는 방법
// 문자열 타입 => 불리언 타입 !!'x'; // -> true !!''; // -> false !!'false'; // -> true // 숫자 타입 => 불리언 타입 !!0; // -> false !!1; // -> true !!NaN; // -> false !!Infinity; // -> true // null 타입 => 불리언 타입 !!null; // -> false // undefined 타입 => 불리언 타입 !!undefined; // -> false // 객체 타입 => 불리언 타입 !!{}; // -> true !![]; // -> true
-
9.4 단축 평가
- 논리 연산자를 사용한 단축 평가
- 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환하는 것을 단축 평가라 한다.
-
단축평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과저을 생략하는 것을 말한다.
단축 평가 표현식 평가 결과 true anything true false anything anything true && anything anything false && anything false -
단축 평가를 사용하면 if 문을 대체할 수 있다.
var done = true; var message = ' '; // 주어진 조건이 true일 때 if (done) message = '완료'; // if 문은 단축 평가로 대체 가능하다. // done이 true라면 message에 '완료'를 할당 message = done && '완료'; console.log(message) // 완료var done = false; var message = ' '; // 주어진 조건이 false일 때 if (!done) message = '미완료'; // if 문은 단축 평가로 대체 가능하다. // done이 false라면 message에 '미완료'를 할당 message = done && '미완료'; console.log(message) // 미완료 -
참고로 삼항 조건 연산자는 if…else문으로 대체할 수 있다.
var done = true; var message = ' '; // if..else 문 if (done) message = '완료'; else message = '미완료'; console.log(message); // 완료 // if..else 문은 삼항 조건 연산자로 대체 가능하다. message = done ? '완료' : '미완료'; console.log(message) // 완료
-
- 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환하는 것을 단축 평가라 한다.
- 옵셔널 체이닝 연산자
-
옵셔널 체이닝 연산자 ?. 는 좌항의 피연산자가 null 또는 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
var elem = null; // elem이 null 또는 undefined이면 undefined를 반환하고, //그렇지 않으면 우항의 프로퍼티 참조를 이어간다. var value = elem?.value; console.log(value); // undefinedvar str = ''; // 문자열의 길이(length)를 참조한다. 이때 좌항 피연산자가 false로 평가되는 Falsy 값이라도 // null 또는 undefined가 아니면 우항의 프로퍼티 참조를 이어간다. var length = str?.length; console.log(length); // 0
-
- null 병합 연산자
-
null 병합 연산자 ??는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
var foo = null ?? 'default string'; console.log(foo); // "default string" -
좌항의 피연산자가 false로 평가되는 Falsy 값(false, undefined, null, 0, -0, NaN, ‘ ’)이라도 null 또는 undefined가 아니면 좌항의 피연산자는 그대로 반환한다.
// 좌항의 피연산자가 Falsy값이라도 null 또는 undefined가 아니면 좌항의 피연산자를 반환한다. var foo = '' ?? 'default string'; console.log(foo); // ""
-
댓글남기기