# 09장 타입 변환과 단축 평가

## 타입 변환

* 자바스크립트 모든 값은 타입이 존재한다.
* 명시적 타입 변환 : 개발자의 의도에 따라 다른 타입으로 값을 변환하는 것 (= 타입캐스팅)
* 암묵적 타입 변환 : 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환 되는 것 (= 타입 강제 변환)
* 기존 원시 값을 직접 변경하는 것이 아니라 **기존 원시 값을 사용해 다른 타입의 새로운 원시 값을 생성**하는 것

### 암묵적 타입 변환

* 자바스크립트 엔진은 코드의 문맥을 고려해 암묵적으로 데이터 타입을 강제 변환할 때가 있다.
* 문자열 타입으로 변환
  * 문자열 연결 연산자 '+'
  * 템프릿 리터럴
* 숫자 타입으로 변환
  * 산술 연산자
  * 비교 연산자
  * **빈문자열, 빈배열, null, false**는 0으로, **true**는 1로 변환된다.
* 불리언 타입으로 변환
  * 조건식 : 제어문 또는 삼항조건연산자의 조건식은 불린언으로 평가되어야 하기 때문에 조건식의 값들은 불리언 타입으로 암묵적 형 변환이 이루어진다.
  * Falsy 값
    1. false
    2. undefined
    3. null
    4. 0,-0
    5. NaN
    6. ''

### 명시적 타입 변환

* 문자열 타입으로 변환
  1. String(1)
  2. (1).toString()
  3. 1+''
* 숫자 타입으로 변환
  1. Number('0')
  2. parseInt('0'), parseFloat('10.02')
  3. 단항 산술연산자 사용 `+'0'`
  4. 산술연산자 사용 `'0'*1`
* 불리언 타입으로 변환
  1. `Boolean('') // false`, `Boolean('가나다') //true`
  2. 부정논리연산자 두번 사용, `!!'x' // true`

## 단축 평가

* 표현식을 평가하는 도중에 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 말한다.
* 여러 패턴에서 유용하게 사용된다.

1. if 대체

```javascript
var done = true 
var message = '' 
message = done && '완료'
// 완료
```

```javascript
var done = false
var message = ''
message = done || '미완료'
// 미완료
```

2. 객체를 참조하기전 객체 유무 확인하고 접근하기

```javascript
var obj = null
var value = obj.key1 // 타입 에러 바로 던져버림

//////////////////
var value = obj&&obj.key1 // null로 평가, 따라서 타입에러 안남
```

3. 함수 매개변수에 기본값 설정할 때

<pre class="language-javascript"><code class="lang-javascript">function test(value) { 
<strong>    value = value || '기본값'; 
</strong>    // 매개변수가 넘어오지 않으면 '기본값'을 사용한다. 
}
</code></pre>

### 옵셔녈 체이닝

* ES11에서 추가됨
* 좌항의 피연산자가 null이나 undefined로 참조할 수 없을 경우 undefined를 반환하고, 참조 가능할경우 참조를 이어간다.&#x20;

```javascript
var obj = null
var value = obj.key1 // 타입 에러 바로 던져버림 
///////////////
var obj = null 
var value = obj?.obj.key1 // undefiend를 반환함.
```

### null병합 연산자

* ES11에서 추가됨
* 좌항이 null이나 undefined일 경우, 우항을 반환, 아니면 좌항을 반환
* 삼항조건식이랑 비슷해보임

```javascript
var test = null ?? '테스트테스트'
console.log(test) // 테스트테스트
```
