JS DeepDive 07장 연산자

한칙촉·2024년 1월 18일

산술 연산자

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

이항 산술 연산자

이항 산술 연산자의미부수 효과
+덧셈x
-뺄셈x
*곱셈x
/나눗셈x
%나머지x

단항 산술 연산자

단항 산술 연산자의미부수 효과
++증가o
--감소o
+효과xo
-양수를 음수로, 음수를 양수로 반전o

→ 피연산자의 값을 변경하는 부수 효과가 존재

var x = 5, result;

result = x++;
console.log(result, x); // 5 6

result = ++x;
console.log(result, x); // 7 7

result = x--;
console.log(result, x); // 7 6

result = --x;
console.log(result, x); // 5 5
  • 전위 증가/감소 연산자 = 먼저 피연산자의 값을 변경한 후, 다른 연산 수행
  • 후위 증가/감소 연산자 = 먼저 다른 연산을 수행한 후, 피연산자의 값을 변경

var x = '1';

console.log(+x); // 1
console.log(x); // "1"

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

x = false;
console.log(+x); // 0
console.log(x); // false

x = 'Hello';
console.log(+x); // NaN
console.log(x); // "Hello"

문자열 연결 연산자

// 문자열 연결 연산자
'1' + 2; // → 12
1 + '2'; // → 12

// 산술 연산자
1 + 2; // → 3

// true는 1로 타입 변환
1 + true; // → 1

// false는 0으로 타입 변환
1 + false; // → 1

// null은 0으로 타입 변환
1 + null; // → 1

// undefined는 숫자 타입으로 변환 X
+undefined; // → NaN
1 + undefined; // → NaN
  • 불리언 타입을 숫자 타입으로 강제 변환
    암묵적 타입 변환 (타입 강제 변환)

할당 연산자

: 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당 (부수 효과)
→ 할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가됨


비교 연산자

동등/일치 비교 연산자

비교 연산자의미사례설명부수 효과
==동등 비교x == yx와 y의 값이 같음x
===일치 비교x === yx와 y의 값과 타입이 같음x
!=부동등 비교x != yx와 y의 값이 다름x
!==불일치 비교x !== yx와 y의 값과 타입이 다름x
  • 동등 비교 연산자 = 좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교
  • 일치 비교 연산자 = 좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한해 true 반환

NaN === NaN; // → false

Number.isNaN(NaN); // →  true
Number.isNaN(10); // → false
Number.isNaN(1 + undefined); // →  true
  • NaN = 자신과 일치하지 않는 유일한 값
  • 숫자가 NaN인지 조사하기 위해서 빌트인 함수 Number.isNaN를 사용

대소 관계 비교 연산자

: 피연산자의 크기를 비교하여 불리언 값 반환


삼항 조건 연산자

: 조건식 ? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값
→ 삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식인 문

var x = 10;

// 삼항 조건 연산자 표현식은 표현식인 문이므로 값처럼 사용 가능
var result = x % 2 ? '홀수' : '짝수';
console.log(result); // 짝수

논리 연산자

논리 연산자의미부수 효과
||논리합 (OR)x
&&논리곱 (AND)x
!부정 (NOT)x
  • 피연산자가 불리언 값이 아니면 불리언 타입으로 암묵적 타입 변환됨
  • 논리합 또는 논리곱 연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가됨

!(x || y) === (!x && !y)
!(x && y) === (!x || !y)
  • 드 모르간 법칙을 활용하면 복잡한 표현식을 가독성 좋은 표현식으로 반환 가능

쉼표 연산자

: 왼쪽 피연산자부터 차례대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면 마지막 피연산자의 평가 결과를 반환

var x, y, z;

x = 1, y = 2, z = 3; // 3

그룹 연산자

: 소괄호로 피연산자를 감싸고 자신의 피연산자인 표현식을 가장 먼저 평가
→ 연산자의 우선순위 조절 가능

10 * 2 + 3 // → 23

// 그룹 연산자를 사용하여 우선순위 조절
10 * (2 + 3) // → 50

typeof 연산자

: 피연산자의 데이터 타입을 문자열로 반환

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" 
  • null 값을 연산하면 "object"를 반환
    → null 타입인지 확인할 때는 일치 연산자(===)를 사용
var foo = null;

typeof foo === null; // → false
foo === null; // → true

// undeclared 식별자를 선언한 적이 없음
typeof undeclared; // → undefined
  • 선언하지 않은 식별자를 typeof 연산자로 연산하면 ReferenceError가 발생하지 않고 undefined를 반환

지수 연산자

: 좌항의 피연산자를 밑으로, 우항의 피연산자를 지수로 거듭 제곱하여 숫자 값을 반환

2 ** 2; // → 4
2 ** 2.5; // → 5.65685424949238

-5 ** 2; // → SyntaxError
(-5) ** 2; // → 25

var num = 5;
num **= 2; // → 25

2 * 5 ** 2; // → 50
  • 지수 연산자 도입 이전에는 Math.pow 메서드를 사용
  • 음수를 거듭제곱의 밑으로 사용하려면 괄호로 묶어야 함
  • 다른 산술 연산자와 마찬가지로 할당 연산자와 함께 사용 능
  • 이항 연산자 중 우선순위가 가장 높음

연산자의 부수 효과

부수 효과가 있는 연산자
= 할당 연산자(=), 증가/감소 연산자(++/--), delete 연산자

var x;

// 할당 연산자 = 변수 값이 변하는 부수 효과
x = 1;
console.log(x); // 1

// 증가/감소 연산자 = 피연산자의 값을 변경하는 부수 효과
x++;
console.log(x); // 2

var o = { a: 1 };

// delete 연산자 = 객체의 프로퍼티를 삭제하는 부수 효과
delete o.a;
console.log(o); // {}
profile
빙글빙글돌아가는..

0개의 댓글