연산자
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
연산자를 사용하도록 하자.
Object.js
NaN과 -0, 0의 비교: 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. 그룹 연산자
그룹 ( … )
연산자를 이용해 연산자 우선순위를 조절할 수 있다.
typeof
연산자
8. 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
: 프로퍼티 존재 확인