1. 타입 변환이란?
- 명시적 타입 변환 · 타입 캐스팅: 개발자가 의도적으로 값의 타입을 변환하는 것
- 암묵적 타입 변환 · 타입 강제 변환: 개발자의 의도와는 상관없이 표현식을 평가하는 도중에 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되는 것
- 두 타입 변환 모두 기존 원시값을 직접 변경하는 것 아님
- 원시값 = 변경 불가능한 값 ⇒ 변경할 수 없음
- 타입 변환: 기존 원시값을 사용해 다른 타입의 새로운 원시 값을 생성하는 것
2. 암묵적 타입 변환
- 빈 문자열, 빈 배열, null, false는 0으로 변환
- true는 1로 변환
- 자바스크립 엔진은 불리언 타입이 아닌 값을 Truthy 값 (참으로 평가되는 값) 또는 Falsy 값 (거짓으로 평가되는 값)으로 구분함
- 제어문의 조건식과 같이 불리언 값으로 평가되어야 할 문맥에서 Truthy 값은 true로, Falsy 값은 false로 암묵적 타입 변환이 됨
- Falsy 값
- false
- undefined
- null
- 0, -0
- NaN
- ‘’ (빈문자열)
- 이외의 값은 모두 Truthy 값임
// 전달받은 인수가 Falsy 값인지
function isFalsy(v) { return !v; }
// 전달받은 인수가 Truthy 값인지
function isTruthy(v) { return !!v; }
3. 명시적 타입 변환
- 명시적 타입 변경 방법
- 표준 빌트인 생성자 함수를 new 연산자 없이 호출
- 표준 빌트인 생성자 함수: 객체를 생성하기 위한 함수이며 new 연산자와 함께 호출
- 빌트인 메서드 사용
- 자바스크립트에서 기본 제공하는 빌트인 객체의 메서드
- 암묵적 타입 변환
- 표준 빌트인 생성자 함수를 new 연산자 없이 호출
- 문자열 타입으로 변환
- String 생성자 함수를 new 연산자 없이 호출String(1)
- Object.prototype.toString 메서드 사용(1).toString()
- 문자열 연결 연산자 이용1+’’
- 숫자 타입으로 변환
- Number 생성자 함수를 new 연산자 없이 호출Number(’0’) → 0
- Number(true) → 1
- parseInt, parseFloat 함수를 사용 (문자열만 가능)parseInt(’1’) → 1
- + 단항 연산자 이용+’0’
- +false → 0
- * 산술 연산자 이용‘-1’ * 1 → -1
- false * 1 → 0
- 불리언 타입으로 변환
- Boolean 생성자 함수를 new 연산자 없이 호출Boolean(’’) → falseBoolean(Infinity) → true
- Boolean(null) → false
- Boolean(’false’) → true
- !부정 논리 연산자를 두 번 사용!!’’ → false
- !!undefined → false
4. 단축 평가
(1) 논리 연산자
- 논리합(||) 또는 논리곱(&&) 연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가됨 (평가 결과가 불리언 값이 아닐 수 있음)
- 두 연산 모두 좌항에서 우항으로 평가가 진행됨
- 논리곱 연산‘Cat’ && ‘Dog’ ⇒ ‘Dog’ 반환
- 두 개의 연산자가 모두 true로 평가될 때 true 반환
- 두 번째 피연산자까지 평가해 보아야 위 표현식 평가할 수 있음
- 논리 연산의 결과를 결정하는 두 번재 피연산자를 그대로 반환함
- 두 개의 연산자가 모두 true로 평가될 때 true 반환
- 논리합 연산‘Cat’ || ‘Dog’ ⇒ ‘Cat’ 반환
- 두 개의 피연산자 중 하나만 true로 평가되어도 true 반환
- ‘Cat’ 은 Truthy 값이므로 두 번째 피연산자까지 평가해보지 않아도 위 표현식 평가할 수 있음
- 논리 연산의 결과를 결정한 첫 번재 피연산자를 그대로 반환함
- 두 개의 피연산자 중 하나만 true로 평가되어도 true 반환
- 단축 평가
- 논리곱 논리합 연산자가 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환하는 것
- 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것
- 예시
- true || anything ⇒ true
- false || anything ⇒ anything
- true && anything ⇒ anything
- false && anything ⇒ false
- 단축 평가 사용시 if문 대체 가능
- 어떤 조건이 Truthy 값일 때 무언가를 해야 한다면 논리곱 사용message = done && ‘완료’ ⇒ done이 true일 때 message === ‘완료’
- 어떤 조건이 Falsy 값일 때 무언가를 해야 한다면 논리합 사용message = done || ‘미완료’ ⇒ done이 false일 때 message === ‘미완료’
- 객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때
- 객체 : 키와 값으로 구성된 프로퍼티의 집합
- 객체를 가리키기를 기대한 변수의 값이 null 또는 undefined인 경우 객체의 프로퍼티를 참조하면 타입 에러 발생하는데 이때 단축 평가를 사용하면 됨
-
var elem = null; var value = elem && elem.value; // null
- 함수 매개변수에 기본값을 설정할 때
- 함수 호출시 인수 전달하지 않으면 매개변수에는 undefined가 할당되는데 이때 단축 평가를 사용하여 매개변수의 기본값을 설정하면 에러 방지 가능
function getStringLength(str) { str = str || ''; // str이 undefined이면 '' 반환 return str.length; } getStringLength(); // 0 getStringLength('hi'); // 2 // ES6의 매개변수의 기본값 설정 function getStringLength(str = '') { return str.length; } getStringLength(); // 0 getStringLength('hi'); // 2
- 함수 호출시 인수 전달하지 않으면 매개변수에는 undefined가 할당되는데 이때 단축 평가를 사용하여 매개변수의 기본값을 설정하면 에러 방지 가능
(2) 옵셔널 체이닝
- ES11에 도입됨
- 옵셔널 체이닝 연산자 ?. 는 좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어감
var elem = null; var value = elem?.value console.log(value) //undefined
- 객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때 유용함
- Falsey 값인 0이나 ‘’는 객체로 평가될 때도 있어 논리곱 연산자 사용시 의도하지 않은 참조가 이루어졌는데 옵셔널 체이닝은 null이나 undefined가 아닌 Falsy 값이라면 우항의 프로퍼티를 참조 가능하게 함
var str = ''; var length = str && str.length console.log(length) // '' var length = str?.length conosole.log(length) // str이 undefined나 null이 아니므로 length는 0
(3) null 병합 연산자
- nullish coalescing 연산자 ??
- 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고 그렇지 않으면 좌항의 피연산자를 반환함
- 변수에 기본값을 설정할 때 유용함
var foo = null ?? 'default string'; console.log(foo) // default string , 좌항의 피연산자가 null이므로 우항 반