본문 바로가기
Books/모던 JS Deep Dive ✔️

[모던 JS Deep Dive] 7장 - 연산자

by Aaron-Kim 2021. 12. 9.

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 연산자 결합 순서

 - 연산자의 좌항/우항 어느 쪽부터 평가를 수행할 것인지 나타내는 순서

반응형

댓글