Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

늘보블로그

연산자 본문

스터디로그/javascript

연산자

개발자늘보 2020. 12. 4. 03:01

자바스크립트의 연산자


  • 연산자: 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행함. 값으로 평가된 피연산자를 연산해 새로운 값을 만듦.
    • 피연산자: 연산의 대상. 값으로 평가될 수 있는 표현식.
    • 연산자 표현식: 피연산자+연산자. 값으로 평가될 수 있는 표현식.

1. 산술 연산자

  • 수학적 계산을 수행해 새로운 숫자 값을 만듦.
  • 연산 불가능 시 NaN 반환
  • 이항 산술 연산자: 2개의 피연산자를 산술 연산
    • +, -, *, /, %가 해당
    • 피연산자의 값을 변경하는 부수 효과 없음
  • 단항 산술 연산자: 1개의 피연산자를 산술 연산
    • ++(증가), --(감소), +, -가 해당
    • ++, --만 부수 효과 있음
    • 숫자 피연산자에 +는 아무 효과 없음. -는 양수를 음수로 반전한 값 반환. (ex: console.log(-(-10)); // 10)
  • 전위 증가/감소 연산자는 증가/감소가 먼저 시행. 런타임 시점에서 1회 선 실행됨.
  • 후위 증가/감소 연산자는 다른 연산이 먼저 시행.
var x = 5, result;
result = x++;
console.log(result, x); // 5 6

result = ++x;
console.log(result, x); // 7 7
  • 숫자 타입이 아닌 피연산자에 +, - 단항 연산자 사용 시 피연산자를 숫자 타입으로 변환한 값을 생성해서 반환(부수 효과 X).
var x = '1';
console.log(+x); // 1

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

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

x = 'hello';
console.log(+x); // NaN
  • 문자열 연결 연산자: + 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작.
    • 문자열 연결의 경우를 포함해 피연산자들의 타입이 다를 경우 암묵적 타입 변환(강제 타입 변환) 발생.
      '1' + 2; // '12'
      1 + '2'; // '12'
      1 + true; // 2
      1 + false; // 1
      1 + null; // 1
      1 + undefined // NaN

2. 할당 연산자

  • 우항(피연산자)의 평가 결과를 좌항(변수)에 할당. 변수 값이 변하는 부수 효과 있음.
  • =, +=, -=, *=, /=, %=가 해당됨
  • 할당문은 표현식인 문 -> 표현식은 값으로 평가될 수 있는 문 -> 할당문은 값으로 평가됨. 연쇄 할당으로 활용 가능
var a, b, c;

// 연쇄 할당. 오른쪽에서 왼쪽으로 진행. c = 0 -> 0, b = 0 -> 0을 거쳐 a = 0이라는 값으로 평가됨.
a = b = c = 0;
console.log(a, b, c); // 0 0 0

3. 비교 연산자

  • 좌항과 우항의 피연산자를 비교해 그 결과를 불리언 값으로 반환

  • 동등 비교(==), 일치 비교(===) 연산자, 대소 관계 비교 연산자(>, <, >=, <=)가 해당됨

    • 동등 비교: 값이 같으면 true, 다르면 false -> 비교하는 두 값은 암묵적 타입 변환 시행됨.
    • 일치 비교: 값과 타입이 모두 같으면 true, 하나라도 다르면 false.
  • 동등 비교는 결과 예측이 어려우므로 일치 비교 사용 권장.

  • 특수값

    • NaN: 자신과 일치하지 않는 유일한 값. 특정 값이 NaN인지 조사하려면 빌트인 함수 isNaN을 사용해야 함

      NaN === NaN; // false
      isNaN(NaN); // true
      isNaN(10); // false
      isNaN(1 + undefined) // true
    • 0: 양의 0(0)과 음의 0(-0)이 있는데 동등/일치 비교 모두 true 반환

    • ES6에서 Object.is의 도입으로 특수값의 정확한 비교가 가능해짐

      ```javascript

    • 0 === +0; // true
      Object.is(-0, +0); // false

      NaN === NaN // false;
      Object.is(NaN, NaN) // true;

4. 삼항 조건 연산자

  • 조건식의 평가 결과에 따라 반환할 값을 결정함. 부수 효과 없음. 두 번째 피연산자 또는 세 번째 피연산자로 평가되는 표현식.
// 조건식 ? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값
var result = score >= 60 ? 'pass' : 'fail';
  • 피연산자1: 조건식, 불리언 타입의 값으로 평가될 표현식. 피연산자1의 평가 결과가 불리언 값이 아니면 불리언 값으로 암묵적 타입 변환됨.
var x = 2;

// 2 % 2는 0, 0은 false로 암묵적 타입 변환
var result = x % 2 ? '홀' : '짝';
console.log(result); // 짝
  • if...else문과의 차이: 삼항 조건 연산자는 값처럼 사용이 가능 -> 다른 표현식의 일부가 될 수 있음. 조건에 따라 변수 값 할당이 가능.
  • 조건에 따라 수행해야 할 문이 여러 개라면 if...else문이 가독성이 좋음.

5. 논리 연산자

  • 우항과 좌항의 피연산자(부정 논리 연산자 !의 경우 우항의 피연산자)를 논리 연산함.
  • 논리합(||), 논리곱(%%), 부정 논리(!) 연산자가 해당됨
  • 부정 논리 연산자는 불리언 값을 반환함. 피연산자가 불리언 값이 아니면 불리언 타입으로 암묵적 타입 변환됨. (ex: !0; // true !'Hello'; // false)
  • 논리합과 논리곱 연산자 표현식은 2개의 피연산자 중 어느 한쪽으로 평가됨. (ex: 'Cat' && 'Dog; // 'Dog');

6. 쉼표 연산자

  • 왼쪽 피연산자부터 평가해 마지막 피연산자의 평가가 끝나면 마지막 피연산자의 평가 결과를 반환함
    var x, y, z;
    x = 1, y = 2, z = 3; // 3

7. 그룹 연산자

  • 소괄호로 감싸서 표현. 사용 시 자신의 피연산자인 표현식을 가장 먼저 평가함. -> 연산자의 우선순위를 조절할 수 있음.

8. typeof 연산자

  • 피연산자의 데이터 타입을 문자열로 반환
  • 반환 문자열 종류: "string", "number", "boolean", "undefined", "symbol", "object", "function" -> 데이터 타입과 완전히 일치하지는 않음
    • null, 배열([]), 객체({}), new 연산자(new Date()), 정규식(/test/gi)은 "object"
    • null이 "object"인 것은 버그! 일치 연산자(===)로 확인할 것
  • 선언하지 않은 식별자를 typeof 연산자로 연산할 경우 ReferenceError가 발생하지 않고 undefined 반환함

9. 지수 연산자

  • ES7에서 도입. 좌항의 피연산자를 밑, 우항의 피연산자를 지수로 거듭 제곱하여 숫자 값 반환
  • 기존의 Math.pow 메서드와 같은 효과. 가독성이 더 좋음.
  • 할당 연산자와 함께 사용 가능
var num = 5;
num ~~= 2; // 25
  • 이항 연산자 중에서 우선순위가 가장 높음
2 * 5 ** 2; // 50

10. 기타 연산자

(예정)

11. 연산자의 부수 효과

  • 부수 효과: 피연산자의 값이 변환 -> 다른 코드에 영향을 주게 됨
  • 할당 연산자 =, 증가/감소 연산자 ++/--, delete 연산자만 부수 효과가 있음
    • delete: 프로퍼티 삭제

12. 연산자 우선순위

  • 여러 개의 연산자로 이뤄진 문이 실행될 때 연산자가 실행되는 순서. 우선순위가 높을수록 먼저 실행됨.
우선순위 연산자
1 ()
2 new(매개변수 존재), . , [](프로퍼티 접근), ()(함수 호출), ?.(옵셔널 체이닝 연산자)
3 new(매개변수 미존재)
4 x++, x--
5 !x, +x, -x, ++x, --x, typeof, delete
6 **(이항 연산자 중 우선순위가 가장 높음)
7 *, /, %
8 +, -
9 <, <=, >, >=, in, instanceif
10 ==, !=, ===, !==
11 ??(null 병합 연산자)
12 &&
13
14 삼항 조건 연산자
15 할당 연산자(=, +=, -= 등)
16 ,
- 모두 기억하기는 어려우므로 연산자 우선순위가 가장 높은 그룹 연산자를 사용해 우선순위를 명시적으로 조절하는 게 좋음

13. 연산자 결합 순서

  • 연산자의 어느 쪽(좌항 or 우항)부터 평가를 수행할 것인지 나타내는 순서
    결합 순서 연산자
    좌 -> 우 +, -, /, %, <, <=, >, >=, &&,
    우 -> 좌 ++, --, 할당 연산자(= 등), !x, +x, -x, ++x, --x, typeof, delete, 삼항 조건 연산자

'스터디로그 > javascript' 카테고리의 다른 글

타입 변환 1  (0) 2020.12.16
제어문  (0) 2020.12.15
데이터타입  (0) 2020.12.04
  (0) 2020.12.03
표현식  (0) 2020.12.03