JavaScript/모던 자바스크립트 Deep Dive

5. 연산자 (Operator)

2022. 7. 22. 20:05

연산자

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

❓연산의 대상 = 피연산자(Operand)

피연산자는 값으로 평가될 수 있는 표현식이어야 한다. 그리고 피연산자와 연산자의 조합으로 이뤄진 연산자 표현식도 값으로 평가될 수 있는 표현식이어야 한다.

 

자바스크립트가 제공하는 다양한 연산자에 대해 살펴본다.

 

 

산술 연산자

피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자 값을 만든다. 산술 연산이 불가능한 경우, NaN을 반환한다.

이항 산술 연산자

2개의 피연산자를 산술 연산해 숫자 값을 만든다.

+ (덧셈), - (뺄셈), * (곱셈), / (나눗셈), % (나머지)

 

단항 산술 연산자

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

++ (증가), -- (감소), +, - (양수를 음수로, 음수를 양수로 바꾼 값 반환)

증가/감소(++/--) 연산자
✅ 피연산자의 값을 변경한다.
✅ 전위 증가/감소 연산자: 선 증가/감소 후 할당
✅ 후위 증가/감소 연산자: 선 할당 후 증가/감소
❗️숫자 타입이 아닌 피연산자 앞에 +, -를 붙이면 피연산자를 숫자 타입으로 변환한 값을 새로 생성해서 반환한다.
var x = '1';

console.log(+x); // 1
console.log(x); // "1", 기존의 값은 그대로 유지된다.

x = true;
console.log(+x); // 1
console.log(x); // true

x = -10;
console.log(-x); // 10; // 숫자로 변환되고 부호가 반전된 값을 생성해 반환한다.

x = 10;
console.log(-x) // -10;

x = true;
console.log(-x) // -1;

문자열 연결 연산자

+ 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
// 문자열 연결 연산자
'1' + 2; // '12'

// true는 1로, false는 0으로 타입 변환된다. (암묵적 타입 변환)
1 + true; // 2
1 + false; // 1

// null은 0으로 타입 변환된다.
1 + null; // 1

// undefined는 숫자로 타입 변환되지 않는다.
+undefined; // NaN
1 + undefined // NaN

❗️암묵적 타입 변환 (Implicit coercion)

자바스크립트 엔진에 의해 암묵적으로 값의 타입이 자동 변환되는 것을 말한다.

 

할당 연산자

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

// 문자열 연결 연산자
var str = 'My name is';
str += 'Lee';
console.log(str); // 'My name is Lee';

할당문은 값으로 평가되는 표현식인 문으로, 할당된 값으로 평가된다. 따라서 할당문을 다른 변수에 연쇄 할당할 수 있다.

var a, b, c;

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

 

비교 연산자

좌항과 우항의 피연산자를 비교한 다음 그 결과를 boolean 값으로 반환한다.

비교 연산자는 if 문, for 문과 같은 제어문의 조건식에서 주로 사용한다.

비교 연산자의 종류

동등 비교 연산자 (==)

좌항과 우항의 피연산자 비교 시 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다.

동등 비교 연산자는 편리한 경우도 있지만 결과를 예측하기 어렵고 실수하기 쉽다. 따라서 동등 비교 연산자보다 일치 비교(===) 연산자를 사용하는 것이 좋다.

 

일치 비교 연산자 (===)

좌항과 우항의 피연산자의 타입과 값 모두 같은 경우에만 true를 반환한다. 암묵적 타입 변환을 하지 않고 값을 비교한다.

// 동등 비교
5 == 5; // true

// 타입은 다르지만 암묵적 타입 변환되어 타입이 일치하면 동등하다.
5 == '5'; // true

// 일치 비교
5 === '5' // false

 

❗️일치 비교 연산자에서의 NaN과 0

  • NaN은 자신과 일치하지 않는 유일한 값이다. 따라서 숫자가 NaN인지 확인하려면 빌트인 함수 isNaN을 사용한다.
  • 자바스크립트에는 양의 0과 음의 0이 존재하는데 이들을 비교하면 true를 반환한다.
NaN === NaN; // false

// isNAN 함수는 인자의 값이 NaN인지 확인하고 그 결과를 boolean 값으로 반환한다.
isNaN(NaN); // true
isNaN(10); // false;
isNaN(1 + undefined); // true

// 양의 0과 음의 0을 일치/동등 비교하면 모두 결과는 true이다.
0 === -0; // true
0 == -0; // true

// ES6에 도입된 Object.is 메소드는 일치 비교 연산자(===)처럼 동작한다.
Object.is(-0, 0); // false
Object.is(NaN, NaN) // true

대소 관계 비교 연산자

대소 관계 비교 연산자

 

삼항 조건 연산자

조건식의 평가 결과에 따라 반환할 값을 결정한다.
조건식 ? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값

 

삼항 조건 연산자 표현식과 if...else 문

삼항 조건 연산자 표현식은 조건문이다. 따라서 if...else 문을 사용해 유사하게 처리할 수 있다.

var x = 2;

// x가 짝수이면 '짝수'를 홀수이면 '홀수'를 반환한다.
// 2 % 2는 0이고 0은 false로 암묵적 타입 변환된다.
var result = x % 2 ? '홀수' : '짝수';

console.log(result); // 짝수
----------------------------------------------------------------------------------------------
var x = 2, result;

if (x % 2) result = '홀수';
else result = '짝수';

console.log(result); // 짝수

삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식인 문이다. 그러나 if...else는 표현식이 아닌 문으로 값처럼 사용할 수 없다.

 ✅ 조건에 따라 어떤 값을 결정해야 한다면? 삼항 조건 연산자 표현식을 사용하는 것이 좋다.
 ✅ 조건에 따라 수행해야 할 문이 여러 개이면? if...else문의 가독성이 좋다.

 

논리 연산자

우항과 좌항의 피연산자를 논리 연산한다.

논리 부정 연산자(!)의 피연산자는 반드시 boolean 값일 필요는 없다. 만약 boolean 값이 아니면 boolean 타입으로 암묵적 타입 변환된다.

!0; // true
!'Hello'; // false

논리합(||)과 논리곱(&&) 연산자 표현식의 평가 결과는 불리언 값이 아닐 수도 있고 언제나 2개의 피연산자 중 어느 한쪽으로 평가된다.

// 단축 평가 (뒤에서 자세히 다루겠다)
'Cat' && 'Dog' // 'Dog'

 

쉼표 연산자(,)

왼쪽부터 차례대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면 마지막 피연산자의 평가 결과를 반환한다.
var x, y, z;
x = 1, y = 2, z = 3; // 3

 

그룹 연산자 ('()')

소괄호('()')로 피연산자를 감싸 해당 표현식을 가장 먼저 평가한다.
10 * 2 + 3   // 23
10 * (2 + 3) // 50

 

typeof 연산자

피연산자의 데이터 타입을 문자열로 반환한다.
  • 반환하는 것: 'string', 'number', 'boolean', 'undefined', 'symbol', 'object', 'function'
typeof ''              // "string"
typeof 1               // "number"
typeof NaN             // "number"
typeof true            // "boolean"
typeof undefined       // "undefined"
typeof Symbol()        // "symbol"
typeof null            // "object"
typeof []              // "object"
typeof {}              // "object"
typeof new Date()      // "object"
typeof /test/gi        // "object"
typeof function () {}  // "function"

❗️typeof null

typeof 연산자로 null 값을 연산하면 object로 반환된다. 자바스크립트 첫 버전의 버그로 기존 코드에 영향을 줄 수도 있어 아직 수정되지 못했다고 한다. 따라서, null 타입인지 확인할 때는 일치 비교 연산자(===)를 사용하면 된다.

 

❗️typeof 선언하지 않은 식별자

// undeclared 식별자를 선언하지 않아서 undefined가 반환된다.
typeof undeclared; // undefined

 

 

지수 연산자 (**)

ES7에 도입. 좌항의 피연산자를 밑(base)으로, 우항의 피연산자를 지수(exponent)로 거듭제곱해 숫자 값을 반환한다.
  • 지수 연산자가 도입되기 전까지는 Math.pow() 메서드를 사용했다. 지수 연산자(**)가 훨씬 가독성이 좋다.
  • 거듭제곱의 밑을 음수로 활용하려면 괄호로 묶어야 한다.

 

참고

https://poiemaweb.com/js-operator

'JavaScript > 모던 자바스크립트 Deep Dive' 카테고리의 다른 글

7. 타입 변환과 단축 평가  (0) 2022.07.23
6. 제어문  (0) 2022.07.22
4. 데이터 타입 (Data Type)  (0) 2022.07.21
3. 표현식과 문  (0) 2022.07.20
2. 변수  (0) 2022.07.18
'JavaScript/모던 자바스크립트 Deep Dive' 카테고리의 다른 글
  • 7. 타입 변환과 단축 평가
  • 6. 제어문
  • 4. 데이터 타입 (Data Type)
  • 3. 표현식과 문
sandwe
sandwe
sandwe
sandwe
sandwe
전체
오늘
어제
  • 분류 전체보기 (69)
    • CSS (1)
    • 알고리즘 (35)
    • JavaScript (30)
      • 모던 자바스크립트 Deep Dive (30)
    • React (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 선언적
  • 투 포인터
  • 구조 분해 할당
  • 프로그래머스
  • dfs
  • 정렬
  • Error Boundary
  • 클로저
  • 다이나믹 프로그래밍
  • Suspense
  • Subsets
  • 스프레드 문법
  • 백준
  • BFS
  • 렌더링 과정
  • 백트래킹
  • javascript
  • 이진 탐색
  • map
  • 해시 테이블
  • 알고리즘
  • 해쉬 맵
  • 프로토타입
  • 이터러블
  • Leetcode
  • float
  • 표준 빌트인 객체
  • React Query
  • 스택
  • string

최근 댓글

최근 글

hELLO · Designed By 정상우.
sandwe
5. 연산자 (Operator)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.