[learning javascript] chapter 5. 표현식과 연산자

표현식과 연산자

연산자

산술 연산자

연산자 우선순위

let x = 3, y;
x += y = 6*5/2
// 이 표현식을 우선순위에 따라 일어날 행동에 괄호를 사용하겠음
// 곱셈과 나눗셈. 우선순위 14, 왼쪽에서 오른쪽으로
//  x += y = (6*5)/2
//  x += y = (30/2)
//  x += y = 15
// 할당. 우선순위 3, 오른쪽에서 왼쪽으로
//  x += (y = 15)
//  x += 15         y는 이제 15
//  18              x는 이제 18

비교 연산자

const a = { name: “an object” }; const b = { name: “an object” }; a === b; // false – 객체는 항상 다름 a !== b; // true a == b; // false – 권장 x a != b; // true – 권장 x


## 숫자 비교
- NaN은 자신을 포함하여 무엇과도 같지 않음
- NaN === NaN, NaN == NaN 모두 false
- isNaN()으로 NaN여부 확인 가능
- 정수형은 일치 연산자 사용 가능 (안전 범위내)
- 여기서 안전 범위란 Number.MIN_SAFE_INTEGER이상, Number.MAX_SAFE_INTEGER이하를 말함
- 소수점이 있는 숫자 비교 시 일치 연산자를 사용하는 것이 아니라 해당 숫자에 가깝냐로 해야 함
- 이유는 자바스크립트의 숫자 기본형태인 `double`형식은 근사치라 정확한 숫자 비교가 되지 않음
```javascript
let n = 0;
while(true) {
    n += 0.1;
    // 0.1씩 더하는 연산시 정확히 0.3이 나오지 않음 (0.30000000000000004)
    // 따라서 해당 조건문을 타지않고 무한루프
    if (n === 0.3) break;
}
console.log(`Stopped at ${n}`);

문자열 병합

논리 연산자

참 같은 값과 거짓 같은 값

AND, OR, NOT

단축 평가

피연산자가 불리언이 아닐 때 논리 연산자가 동작하는 방법

x y x && y
거짓같은 값 거짓 같은 값 x (참같은 값)
거짓같은 값 참 같은 값 x (거짓같은 값)
참같은 값 거짓 같은 값 y (거짓같은 값)
참같은 값 참 같은 값 y (참같은 값)
x y x || y
거짓같은 값 거짓 같은 값 y (거짓같은 값)
거짓같은 값 참 같은 값 y (참같은 값)
참같은 값 거짓 같은 값 x (참같은 값)
참같은 값 참 같은 값 x (참같은 값)
const options = suppliedOptions || { name: "Default" }

조건 연산자

쉼표 연산자

연산자 그룹

비트 연산자

| 연산자 | 설명 | 예제 | |——|—–|—–| | & | 비트 AND | 0b1010 & 0b1100 // 결과: 0b1000 | | | | 비트 OR | 0b1010 | 0b1100 // 결과: 0b1110 | | ^ | 비트 XOR | 0b1010 ^ 0b1100 // 결과: 0b0110 | | ~ | 비트 NOT | ~0b1010 // 결과: 0b0101 | | « | 왼쪽 시프트 | 0b1010 « 1 // 결과: 0b10100
0b1010 « 2 // 결과 : 0b101000 | | » | 부호 따라가는(Sign-propagating) 오른쪽 시프트 | 아래 코드 참조 | | »> | 0으로 채우는(Zero-fill) 오른쪽 시프트 | 아래 코드 참조 |

// 표현식 하나로 여러 플래그를 동시에 판단 const hasReadOrExecute = p & (FLAG_READ | FLAG_EXECUTE); const hasReadAndExecute = p & (FLAG_READ | FLAG_EXECUTE) === FLAG_READ | FLAG_EXECUTE;

- `hasReadOrExecute`와 `hasReadANdExecute`는 AND가 OR보다 우선순위가 높으므로, 그룹을 써서 우선순위를 강제 해야함.

#### typeof 연산자
- 피연산자의 타입을 나타내는 문자열 반환
- 단, `undefined`, `null`, 불리언, 숫자, 문자열, 심볼, 객체를 정확히 나타내지 못함
- null을 "object"로 반환
- 배열과 배열 아닌 객체도 정확히 구분하지 못함
- 함수(객체의 특별한 타입)는 정확히 식별하지만, typeof []은 "object"를 반환

| 표현식 | 반환값 | 참고 |
|------|------|-----|
| typeof undefined | "undefined" | |
| typeof null | "object" | 애석하지만 사실 |
| typeof {} | "object" | |
| typeof true | "boolean" | |
| typeof 1 | "number" | |
| typeof "" | "string" | |
| typeof Symbol() | "symbol" | ES6에서 새로 생김 |
| typeof function() {} | "function" | |
- typeof는 연산자이므로 괄호는 필요 없음

#### void 연산자
- 피연산자를 평가한 후 undefined를 반환
- 거의 사용하지 않음
- 가끔 HTML에서 다른 페이지로 이동하는 일을 막을 때 아래와 같이 사용
```html
<a href="javascript:void 0">Do nothing.</a>

할당 연산자

const nums = [3, 5, 15, 7, 5]; let n, i=0; // 먼저 nums[i]의 값을 받고, 표현식 전체가 그 값으로 평가되므로 숫자로 비교할 수 있음 while((n = nums[i]) < 10 && i++ < nums.length) { console.log(Number less than 10: ${n}.); } console.log(Number greater than 10 found: ${n}.); console.log(${nums.length - i - 1} numbers remain.);

- 연산과 할당을 한꺼번에 수행하는 간편한 할당 연산자도 있음

| 연산자 | 동등한 표현 |
|------|----------|
| x += y | x = x + y |
| x -= y | x = x - y |
| x *= y | x = x * y |
| x /= y | x = x / y |
| x %= y | x = x % y |
| x <<= y | x = x << y |
| x >>= y | x = x >> y |
| x >>>= y | x = x >>> y |
| x &= y | x = x & y |
| x \|= y | x = x \| y |
| x ^= y | x = x ^ y |

## 해체 할당
- ES6에서 새로 도입
- 객체나 배열을 변수로 '해체'
```javascript
// 객체 선언
const obj = { b: 2, c: 3, d: 4 };

// 해체 할당
const {a, b, c} = obj;
a;      // undefined: obj에는 "a" 프로퍼티가 없음
b;      // 2
c;      // 3
d;      // ReferenceError: "d"는 정의 되지 않았음

// 에러 발생 {a, b, c} = obj;

// 동작함 ({a, b, c} = obj);

- 배열을 해체할 때는 배열 요소에 대응할 변수 이름을 마음대로 쓸 수 있으며 이들은 배열 순서로 대응
```javascript
const arr = [1, 2, 3];

// 배열 해체 할당
let [x, y] = arr;
x;      // 1
y;      // 2
z;      // ReferenceError: "z"는 정의되지 않았음

let [x, y, …rest] = arr; x; // 1 y; // 2 rest; // [3, 4, 5]

- 배열 해체를 활용하면 변수의 값을 서로 바꿀 수 있음. 해체를 사용하지 않으면 임시 변수가 필수
```javascript
let a = 5, b = 10;
[a, b] = [b, a];
a;      // 10
b;      // 5

템플릿 문자열과 표현식

표현식과 흐름 제어 패턴

if…else문을 3항 연산자로 바꾸기

if문을 단축 평가하는 OR 표현식으로 바꾸기

if(!options) options = {};