연산자

1. 연산자와 피연산자

연산자는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산을 수행하여 하나의 값을 만든다.

연산자는 값으로 평가된 피연산자를 연산해 새로운 값을 만든다.

피연산자는 값으로 평가될 수 있는 표현식이어야 한다.

2. 산술 연산자

이항 산술 연산자

이항 binary 산술 연산자는 2개의 피연산자를 산술 연산하여 숫자 값을 만든다.

+, - , *, /, %

단항 산술 연산자

단항 unary 산술 연산자는 1개의 피연산자를 산술 연산하여 숫자값을 만든다.

++, , +, -

이때 증가 / 감소 연산자 (++, )는 피연산자의 값을 변경하는 side effect가 있다.

문자열 연결 연산자

+는 피연산자 중 하나 이상이 string인 경우 문자열 연결 연산자로 동작한다.

3. 할당 연산자

=, +=, -=, *=, /=, %=

할당 assignment 연산자는 우항에 있는 피연산자의 평가 결과를 좌항의 변수에 할당한다.

let a, b, c;
// 연쇄 할당: 오른쪽에서 왼쪽으로 진행
// 1. c = 0 : 0으로 평가
// 2. b = 0 : 0으로 평가
// 3. a = 0 : 0으로 평가
a = b = c = 0;

console.log(a, b, c); // 0 0 0

또한 할당문은 값으로 평가되는 표현식이기도 하다.

이 특징을 이용해 변수에 동일한 값을 연쇄 할당할 수 있다

4. 비교 연산자

==, ===, !=, !==

비교 comparison 연산자는 좌항과 우항의 피연산자를 비교한 다음 그 결과를 boolean 값으로 리턴한다.

loose / strict 비교 연산자

loose (==, !=)비교 연산자는 암묵적 타입 변환을 통해 **두 항의 타입을 일치시킨 후 비교**한다.

strict (===, !==)비교 연산자는 **두 항 피연산자의 타입과 값 둘 다 고려**한다.

따라서 strict 연산자를 사용하도록 하자.

NaN과 -0, 0의 비교: Object.js

NaN === NaN; // false
Object.is(NaN, NaN); //true

0 === -0; // true
Object.is(0, -0); // false

NaN은 자신과 일치하지 않는 유일한 값이다.

또한 숫자 0도 +0-0이 있는데, 이들을 비교하면 true를 리턴한다.

NaN과 (-0, 0)을 비교할때는

=== 대신 Object.js 메서드를 이용하여 비교하자.

5. 논리 연산자

||, &&, !

// 논리합(||) 연산자
true || true; // true
true || false; // true
false || false; // false

// 논리곱(&&) 연산자
true && true; // true
true && false; // false
false && false; // false

// 논리 부정(!) 연산자
!true; // false
!fasle; // true

||, && 연산자는 언제나 2개의 피연산자 중 어느 한쪽으로 평가된다.

// 단축 평가 (리액트에서의 예시)
let selected = true;
{
  selected && <h1>선택되었습니다.</h1>;
} // <h1>선택되었습니다.</h1> 렌더링

let selected = false;
{
  selected && <h1>선택되었습니다.</h1>;
} // 렌더링 되지않음

이는 9장 4절 단축평가에 기록하였다.

드 모르간의 법칙

!(x || y) === (!x && !y);
!(x && y) === (!x || !y);

6. 쉼표 연산자

,

7. 그룹 연산자

그룹 ( … ) 연산자를 이용해 연산자 우선순위를 조절할 수 있다.

8. typeof 연산자

typeof 연산자는 피연산자의 데이터 타입을 문자열로 반환한다.

string, number, boolean, undefined, symbol, object, function

중 하나를 리턴하며, null을 리턴하는 경우는 없다. 버그

함수는 function을 리턴한다

typeof null; // "object"

위 경우 자바스크립트의 버그지만, 다른 코드에 영향을 줄까봐 아직까지 수정되지 못했다.

9. 지수 연산자

**

ES7 에서 도입된 지수 연산자는 수 거듭 제곱을 할 때 이용한다.

2 ** 2; // 4
2 ** (3 ** 2); // 512

중첩하여 사용할 수도 있다. 이때 우항에서 좌항으로 결합한다.

10. 그 외의 연산자

?. : 옵셔닝 체이닝

?? : null 병합

delete: 프로퍼티 삭제

new: 생성자 함수 호출, 인스턴스 생성

instanceof:좌변의 객체가 우변의 생성자 함수로 생성된 인스턴스인지 판별

in: 프로퍼티 존재 확인