7.0 연산자
- 연산의 대상: 피연산자 (operand)
- 피연산자는 값으로 평가될 수 있는 표현식
7.1 산술 연산자
- arithmetic operator
- 산술 연산 불가능한 경우, NaN 반환
- 이항 산술 연산자
- binary arithmetic operator
- 2개의 피연산자 산술 연산하여 숫자 값 생성
- 피연산자의 값 변경하는 부수 효과 없음 (산술 연산 시 피연산자 값 바뀌는 경우 없고 항상 새로운 값 만듦)
- 단항 산술 연산자
- unary arithmetic operator
- 1개의 피연산자 산술 연산하여 숫자 값 생성
- ++ (증가 연산자), -- (감소 연산자) 피연산자 값 변경하는 부수 효과 존재 (암묵적 할당 이루어짐)
- 증/감 연산자는 위치에 의미가 있음
- prefix/postfix increment/decrement operator
- 숫자 타입이 아닌 피연산자에 +/- 단항 연산자를 사용하면 피연산자를 숫자 타입으로 변환하여 반환 (부수 효과 X)
- 문자열은 숫자로 타입 변환 불가하므로 NaN 반환
- 문자열 연결 연산자
- + 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작함
- 그 외의 경우는 산술 연산자로 동작함
- null도 0으로 타입 변환됨 (암묵적 타입 변환 - implicit coercion / 타입 강제 변환 - type coercion)
- undefined는 숫자로 타입 변환 X
7.2 할당 연산자
- assignment operator
- 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당
- 변수 값 변하는 부수 효과 존재
- 복합 대입/할당 연산자
- 할당문은 표현식인 문 (값으로 평가되는 표현식인 문, 할당된 값으로 평가됨)
- 할당문을 다른 변수에 할당 가능 (변수에 동일한 값 연쇄 할당 가능)
7.3 비교 연산자
- comparsion operator
- 좌항과 우항의 피연산자 비교 후 그 결과를 불리언 값으로 반환
- if 문이나 for 문 같은 제어문의 조건식에서 주로 사용
- 동등/일치 비교 연산자
- 동등 비교 연산자 (loose equality)
- 느슨한 비교
- 피연산자 비교 시 먼저 JS 엔진에 의해 암묵적 타입 변환을 통해 타입 일치시킴
- 값만 같은지 비교
- 편리하지만 결과 예측하기 어렵고 실수하기 쉬움 (안티 패턴)
- 사용 권장 X
- 일치 비교 연산자 (strict equality)
- 엄격한 비교
- 값과 타입까지 모두 같은지 비교
- 암묵적 타입 변환 일어나지 X => 예측하기 쉬움
- NaN 비교 주의
- NaN은 자신과 일치하지 않는 유일한 값
- 빌트인 함수 isNaN 이용
- 양의 0과 음의 0 비교 주의
- Object.is 메서드 (ES6) => -0과 +0은 다름, NaN과 NaN은 같음
- 대소 관계 비교 연산자
7.4 삼항 조건 연산자
- ternary operator
- 부수 효과 X
- 조건식 ? true 일 때 반환 값 : false 일 때 반환 값
- 만약 조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 암묵적으로 타입 변환됨
- 삼항 조건 연산자 표현식은 값처럼 사용 가능하지만 if ... else 문은 값처럼 사용 불가
- if ... else 문은 표현식이 아닌 문 (값처럼 사용 불가)
- 삼항 조건 연산자 표현식은 표현식인 문 (값처럼 사용 가능)
- 조건에 따라 수행해야 할 문이 여러 개일 때 if ... else 문의 가독성이 더 좋음
7.5 논리 연산자
- logical operator
- 논리합, 논리곱, 단항 논리 부정
- 부수 효과 X
- 단항 논리 부정 연산자는 언제나 불리언 값 반환
- 논리합, 논리곱 연산자 표현식의 평가 결과는 불리언 값이 아닐 수 있음
- 2개의 피연산자 중 어느 한쪽으로 평가됨
- 'Cat' && 'Dog'; // 'Dog' (단축 평가)
- 드 모르간의 법칙: 가독성 좋음
7.6 쉼표 연산자
- 왼쪽 피연산자부터 차례대로 피연산자 평가, 마지막 피연산자 평가 끝나면 마지막 피연산자 평가 결과 반환
7.7 그룹 연산자
- 소괄호로 피연산자 감싸는 그룹 연산자는 자신의 피연산자인 표현식을 가장 먼저 평가함
- 연산자의 우선순위 조절
- 그룹 연산자는 연산자 우선순위 가장 높음
7.8 typeof 연산자
- 피연산자의 데이터 타입을 문자열로 반환
- null 의 경우 'object' 반환 (JS의 첫번째 버전 버그), 함수의 경우 'function' 반환
- null 타입 체크 시 일치 연산자 (===) 이용
- typeof NaN => 'number', tyepeof Symbol() => 'symbol', typeof /test/gi => 'object'
- 선언하지 않은 식별자를 typeof 연산자로 연산해보면 undefined 반환 (ReferenceError 발생 X)
7.9 지수 연산자
- ES7 도입
- 좌항의 피연산자는 밑 (base), 우항의 피연산자는 지수 (exponent)로 거듭제곱하여 숫자 값 반환
- 우결합성 가짐 (지수 연산자의 결삽 순서는 우항에서 좌항)
- 지수 연산자 도입 전 Math.pow 메서드 사용했음
- 음수를 거듭제곱의 밑으로 사용하기 위해서는 소괄호로 묶어야 함
- 복합 대입 연산자로 활용 가능
- 이항 연산자 중 가장 우선순위 높음
7.10 그 외의 연산자
- ?. (옵셔녈 체이닝 연산자)
- ?? (null 병합 연산자)
- delete (프로퍼티 삭제 연산자)
- new (생성자 함수 호출 시 사용하여 인스턴스 생성)
- instanceof (좌변의 객체가 우변의 생성자 함수와 연결된 인스턴스인지 판별)
- in (프로퍼티 존재 확인)
7.11 연산자의 부수 효과
- 부수 효과 있는 연산자
- 할당 연산자 (=), 증/감 연산자 (++/--), delete 연산자
7.12 연산자 우선순위
- 연산자 실행 순서
- 그룹 연산자 (소괄호) 가 가장 우선순위 높음
- 지수 연산자 (**)는 이항 연산자 중에서 우선순위 가장 높음
- 소괄호로 우선순위 명시적 조절 권장
7.13 연산자 결합 순서
- 연산자의 좌항/우항 어느 쪽부터 평가를 수행할 것인지 나타내는 순서
'Books > 모던 JS Deep Dive ✔️' 카테고리의 다른 글
[모던 JS Deep Dive] 9장 - 타입 변환과 단축 평가 (0) | 2021.12.10 |
---|---|
[모던 JS Deep Dive] 8장 - 제어문 (0) | 2021.12.09 |
[모던 JS Deep Dive] 6장 - 데이터 타입 (0) | 2021.12.08 |
[모던 JS Deep Dive] 5장 - 표현식과 문 (0) | 2021.12.07 |
[모던 JS Deep Dive] 4장 - 변수 (0) | 2021.12.07 |
댓글