[JS Deep Dive] 7장. 연산자

lyshine·2023년 3월 22일
0

JS Deep Dive 정리

목록 보기
4/18
  • 연산는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행해 하나의 값을 만든다. 이때 연산의 대상을 피연산자라 한다. 피연산자는 값으로 평가될 수 있는 표현식이어야 한다.
    • 피연산자는 연산의 대상이 되어야 하므로 값으로 평가할 수 있어야 한다. (값)
    • 연산자는 값으로 평가된 피연산자를 연산해 새로운 값을 만든다.
// 산술 연산자
5 * 4 // 20

// 문자열 연결 연산자
'My name is ' + 'Lee' // "My name is Lee"

// 할당 연산자
var color = 'red'; // "red"

// 비교 연산자
3 > 5 // false

// 논리 연산자
(5 > 3) && (2 < 4)  // true

// 타입 연산자
typeof 'Hi' // "string"

✅ 산술 연산자

  • 산술 연산자는 피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자 값을 만든다.
  • 산술 연산이 불가능할때는 NaN을 반환한다.
  • 이항 산술 연산자 / 단항 산술 연산자로 구분

이항 산술 연산자

  • 이항 산술 연산자는 2개의 피연산자를 대상으로 연산하여 숫자 타입의 값을 만든다.
  • 피연산자의 값을 변경하는 부수 효과가 없다. (단지 새로운 값을 만들 뿐)
  • +, -. *, /, %
5 + 2  // 7
5 - 2  // 3
5 * 2  // 10
5 / 2  // 2.5
5 % 2  // 1

단항 산술 연산자

  • 1개의 피연산자를 대상으로 연산한다.
  • 증가(++)/ 감소(—) 연산자는 피연산자의 값을 변경하는 부수 효과가 있다.
var x = 5, result;

// 선대입 후증가 (Postfix increment operator)
result = x++;
console.log(result, x); // 5 6

// 선증가 후대입 (Prefix increment operator)
result = ++x;
console.log(result, x); // 7 7

// 선대입 후감소 (Postfix decrement operator)
result = x--;
console.log(result, x); // 7 6

// 선감소 후대입 (Prefix decrement operator)
result = --x;
console.log(result, x); // 5 5
  • '+' 단항 연산자는 피연산자에 어떠한 효과도 없지만 숫자 타입이 아닌 피연산자에 사용시 숫자 타입으로 변환하여 반환한다.
  • '-' 단항 연산자는 피연산자의 부호를 반전한 값을 반환한다. + 연산자와 마찬가지로 숫자 타입이 아닌 피연산자에 사용시 숫자 타입으로 변환하여 반환한다.

문자열 연결 연산자

  • '+' 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 사용된다.
// 문자열 연결 연산자
'1' + '2'      // '12'
'1' + 2       // '12'

// 산술 연산자
1 + 2          // 3
1 + true       // 2 (true → 1)
1 + false      // 1 (false → 0)
true + false    // 1 (true → 1 / false → 0)
1 + null       // 1 (null → 0)
1 + undefined // NaN (undefined → NaN)
  • 여기서 주목할 점은 자바스크립트 엔진에 의해 개발자의 의도와는 상관없이 암묵적으로 타입이 자동 변환된다는 점이다.

✅ 할당 연산자

  • 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당한다.
  • 좌항의 변수에 값을 할당하는 부수효과가 있다.
할당 연산자사례동일 표현
=x = yx = y
+=x += yx = x + y
-=x -= yx = x - y
*=x *= yx = x * y
/=x /= yx = x / y
%=x %= yx = x % y

✅ 비교 연산자

  • 비교연산자는 좌항과 우항의 피연산자를 비교하여 불리언 값을 반환한다.
  • if or for문과 같은 제어문의 조건식에서 주로 활용
비교 연산자의미사례설명
==동등 비교x == yx와 y의 값이 같음
===일치 비교x === yx와 y의 값과 타입이 같음
!=부등 비교x != yx와 y의 값이 다름
!==불일치 비교x !== yx와 y의 값과 타입이 다름
  • ==(동등 비교 연산자) 는 암묵적 타입 변환을 통해 타입을 일치시킨 후 비교하지만,
    ===(일치 비교 연산자) 는 타입까지 비교하여 반환한다.
  • 동등 비교 연산자는 편리한 경우도 있지만 부작용을 일으킬 수 있으므로 일치 비교 연산자를 사용하는게 좋다.
  • 일치비교 연산자는 예측하기 쉽다. 다만 NaN은 자신과 일치하지 않는 유일한 값이다. (→ 숫자가 NaN인지 알려면 isNaN(NaN)함수를 사용한다.)

대소 관계 비교 연산자

  • 대소관계 비교 연사자는 피연산자의 크기를 비교하여 불리언 값을 반환한다.
대소 관계 비교 연산자예제설명
>x > yx가 y보다 크다 ✕
<x < yx가 y보다 작다 ✕
>=x >= yx가 y보다 같거나 크다 ✕
<=x <= yx가 y보다 같거나 크다 ✕

✅ 삼항 조건 연산자

  • 삼항 조건 연산자는 조건식의 평가 결과에 따라 반환할 값을 결정한다. 부수 효과는 없다.

조건식 ? 조건식이 ture일때 반환할 값(A) : 조건식이 false일때 반환할 값(B)

  • 물음표(?) 앞의 첫번째 피연산자가 조건식, 즉 불리언 타입의 값으로 평가될 표현식이다. 만약 조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 암묵적 타입 변환된다.
  • 조건식이 참이면 콜론(:) 앞의 피연산자(A)가 평가되어 반환되고, 거짓이면 콜론(:) 뒤의 피연산자(B)가 평가되어 반환된다.
  • if.. else와 같은 기능을 하지만 if..else는 표현식이 아닌 문이고, 값으로 평가할 수 없다. 하지만 삼항 조건 연산자는 값으로 평가할 수 있는 표현식이다.
  • 삼항 조건 연산자식은 다른 표현식의 일부가 될 수 있어 유용
var x = 2;

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

console.log(result); // 짝수

✅ 논리 연산자

  • 논리 연산자는 우항과 좌항의 피연산자(부정 논리 연산자의 경우, 우항의 피연산자)를 논리연산한다.
  • 논리 부정(!) 연산자는 언제나 불리언 값을 반환한다.
  • 하지만 논리합(||) 연산자와 논리곱(&&) 연산자는 일반적으로 불리언 값을 반환하지만 반드시 불리언 값을 반환해야 하는 것은 아니다.
논리 연산자의미
&&논리곱(AND)
!부정(NOT)
// 논리합(||) 연산자
// 하나만 true여도 true
true || true   // true
true || false  // true
false || true  // true
false || false // false

// 논리곱(&&) 연산자
// 둘다 true여야 true
true && true   // true
true && false  // false
false && true  // false
false && false // false

// 논리 부정(!) 연산자
!true  // false
!false // true
// 암묵적 타입 변환
!0 // true

// 논리합과 논리곱 연산자의 연산 결과는 불리언 값이 아닐 수 있음
// 단축 평가
'Cat' && 'Dog' // “Dog”

✅ 쉼표 연산자

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

✅ 그룹 연산자

그룹 ((…))연산자는 그룹 내의 표현식을 최우선으로 평가한다. 그룹 연산자를 사용하면 연산자의 우선 순위를 1순위로 높일 수 있다.

10 * 2 + 3   // 23
10 * (2 + 3) // 50

✅ typeof 연산자

  • typeof 연산자는 자신의 뒤에 위치한 피연산자의 데이터 타입을 문자열로 반환한다.
  • typeof 연산자는 7가지 문자열 “string”, “number”, “boolean”, “undefined”, “symbol”, “object”, “function” 중 하나를 반환한다.
  • “null”을 반환하는 경우는 없다.
    • null은 ‘object’를 반환한다.
    • null 타입을 확인하고 싶으면 일치 연산자(===)를 사용하도록 한다.
  • 함수의 경우 “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"

// 선언하지 않은 식별자는 undefined를 반환
typeof undeclared  // "undefined"

//null은 object를 반환
typeof null  // "object"

// null 타입 확인시에는 ===를 사용
var foo = null;
console.log(typeof foo === null); // false
console.log(foo === null);        // true

✅ 지수 연산자

  • ES7 에서 도입되었고 좌항의 피연산자를 밑으로, 우항의 피연산자를 지수로 거듭 제곱 하여 숫자값을 반환한다.
  • '**'
  • 지수 연산자 도입전에는 Math.pow 사용
  • 음수를 거듭제곱의 밑으로 사용하려면 괄호로 묶어야한다.
  • 이항 연산자 중 우선순위가 가장 높다.

✅ 그 외 연산자

연산자개요
?.옵셔널 체이닝 연산자
??null 병합 연산자
delete프로퍼티 삭제
new생성자 함수를 호출할때 사용하여 인스턴스를 생성
instanceof좌변의 객체가 우변의 생성자 함수와 연결된 인스턴스인지 판별
in프로퍼티 존재 확인

0개의 댓글