FE RYAN
완벽하지 않으면 어때
FE RYAN
전체 방문자
오늘
어제

블로그 메뉴

  • 💾 깃허브 링크
  • 홈
  • 태그
  • 분류 전체보기 (151)
    • 개인프로젝트 (8)
      • 개인 포트폴리오 웹앱 (6)
      • 프론트엔드 기술면접 아카이빙 웹앱 (2)
    • 기록 (121)
      • 원티드 프리온보딩 인턴십 (0)
      • 코드스테이츠 프론트엔드 (75)
      • 생각들 (3)
      • Today I learned (32)
      • 회고 (9)
      • 리뷰 (1)
    • 개발 (17)
      • React (3)
      • Javascript (7)
      • CSS (1)
      • HTML (3)
      • HTTP (1)
      • 자료구조 (0)
      • 알고리즘 (2)
    • 코딩테스트 (2)
      • 백준 (2)
      • 프로그래머스 (0)
    • 디자인 (1)
      • UI & UX (1)
    • 수학 (0)
    • 자기계발 (0)

공지사항

인기 글

태그

  • ES6
  • 타입스크립트
  • 자바스크립트 딥다이브
  • 원시타입
  • HTML
  • seb 39
  • seb39
  • 포트폴리오
  • 프론트엔드
  • useMemo
  • 회고
  • 리액트
  • 메인프로젝트
  • 딥다이브
  • Til
  • 부트캠프
  • 자바스크립트
  • css
  • 코드스테이츠
  • 신입개발자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
FE RYAN

완벽하지 않으면 어때

개발/Javascript

모던 자바스크립트 딥 다이브 7장 연산자 내용 정리

2022. 5. 16. 21:39
728x90

7장 연산자

학습 목표

  • 7.1.2 - 증감연산자의 전위/ 후위 위치별 수행순서
  • 7.1.3 문자열 연결 연산자의 암묵적 형변환, 7.3 - 동등비교연산자의 암묵적 형변환
  • 7.4 - 복잡한 삼항 연산자 문제들
  • 7.5 - 단축 평가로 if문 대체하기 예시 소개
  • 7.11 , 7.12 - 연산자의 부수효과와 우선순위 코드로 이해하기
  • 7.13 - 연산자의 결합 순서 코드로 이해하기

피연산자

연산자는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행해 하나의 값을 만든다. 이때 연산의 대상을 피연산자(operand)라 한다. (p 74)

  • ‘하나 이상’이므로, 피연산자가 한 개여도 됨.
  • 피연산자: 연산의 대상이 되는 값(표현식)이다. 따라서 반드시 값으로 평가될 수 있어야 한다.
  • 피연산자도 표현식이며, 피연산자와 연산자의 조합으로 이뤄진 연산자 표현식도 값으로 평가될 수 있는 표현식이다.
  • 연산자 표현식: 값으로 평가된 피연산자를 연산해 새로운 값을 만듬.

연산자 표현식 예시

// 산술 연산자
3 * 5; // 3도 표현식이며 5도 표현식, 3 * 5도 표현식이다.

// 문자열 연결 연산자
'Hi, ' + 'Ryan!'; // --> Hi, Ryan!

// 비교 연산자
2 > 4; // false

// 논리 연산자(AND, OR, NOT)
true && true; // --> true

// 타입 연산자
typeof obj1; // --> 'object' (obj1이라는 객체가 선언되어 있다고 가정)
  • 연산자 표현식에서 피연산자를 ’명사'로, 연산자를 ’동사'로 생각하면 된다.

7.1 산술 연산자

7.1.1 이항 산술 연산자

  • 이항 = binary 이므로, 숫자 타입의 값인 피연산자 2개를 산술 연산하여 평가되어 숫자 값을 생성.
  • 부수 효과가 없다. 즉 피연산자의 값이 바뀌지 않는다. 산술 연산된 새로운 값만 만든다.
  • 이항 산술 연산자의 종류: 덧셈, 뺄셈, 나눗셈, 곱셈, 나머지 연산자(+, -, /, *, %)

*7.1.2 단항 산술 연산자

부수 효과 있음: ++, —

부수 효과 없음: +, -

  • 일부 단항 연산자는 부수효과를 가진다. 증감연산자(++, —)는 피연산자의 값을 변경시킨다!!
  • +, - 의 단항 산술 연산자는 형변환, 또는 부호를 반전한 값을 반환하나 부수 효과는 없다. 즉 반환값만 다르고 원본(피연산자) 불변.

*증감 연산자의 전위 연산/ 후위 연산의 결과

let x = 3, result = 0;

// 선할당 후증가 -> 후위 증가 연산자(postfix increment operator)
result = x++;
// 1. 할당 먼저: result = 3
// 2. 그다음 증가: x = 4
console.log(result, x); // 3 4

// 선증가 후할당 -> 전위 증가 연산자(prefix increment operator)
result = ++x;
// 1. 증가 먼저: x = 5
// 2. 그다음 할당: result = 5
console.log(result, x); // 5 5

// 선할당 후감소 -> 후위 감소 연산자(prefix decrement operator)
result = x--;
// 1. 할당 먼저: result = 5
// 2. 그다음 감소: x = 4
console.log(result, x); // 5 4

// 선감소 후할당 -> 전위 감소 연산자(prefix decrement operator)
result = --x;
// 1. 감소 먼저: x = 3
// 2. 그다음 할당: result = 3
console.log(result, x); // 3 3
  • 전위(prefix) : 먼저 피연산자의 값부터 증가 또는 감소시키고 나서 다른 연산을 수행.
  • 후위(postfix) : 먼저 다른 연산을 수행한 후, 피연산자의 값을 증가 또는 감소시킴.

*첨언: for문의 증감문으로 ++i 하던 i++하던 반복횟수는 같음. 증감 외에는 다른 연산이 없기 때문에!

단항 산술 연산자 +, - 의 형변환

  • 숫자가 아닌 타입을 숫자 타입으로 형변환 시킨다.
  • 불리언 값도 형변환 시킨다. 자바스크립트에서 true = 1, false = 0 이기 때문에 가능.
// 단항 산술 연산자의 형변환
// + 연산자
let x = '1';
console.log(+x); // --> 1
console.log(x);  // --> '1' (부수효과 없으므로 원본(피연산자) 불변)
+10;    // 10
+(-10); // 10
+'hi'; // NaN

// - 연산자
// 부호 반전(음수 -> 양수)
-(-10); // 10
// 형변환
-'5'; // -5
-'hi'; // NaN

// 불리언 값의 형변환
-true  // -1
+true  // 1
-false //-0
+false // 0

// 응용: map 메서드 활용하기
// map 메서드:
// 배열 요소 갯수만큼 반복하며 배열의 각 요소들마다
// 매개변수로 받은 함수를 실행하여 새로운 배열을 반환.

let strArr = ['1', '2', '3'];
let numArr = strArr.map(item => +item);
console.log(numArr); // --> [1, 2, 3]
console.log(strArr); // --> ['1', '2', '3'] (부수효과 없으므로 원본(피연산자) 불변)

7.2 할당 연산자

  • 좌항의 변수의 기존 값에 우항의 피연산자 평가 결과를 할당.
  • 일반적으로 반복문 내에서 반복시마다 연산 결과를 누적시키기 위해 사용한다.(ex: +=)

할당 연산자의 연쇄 할당

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

let x = y = 10;
console.log(x, y); // 10 10

7.3 비교 연산자

7.3.1 동등/ 일치 비교 연산자

  • 동등 비교 == : 값만 같은지 비교
  • 일치 비교 === : 값과 타입까지 같은지 비교
  • 부동등 비교 != : 값만 다른지 비교
  • 불일치 비교 !== : 값과 타입까지 다른지 비교
5 == '5'  // true - 숫자 5와 문자 5가 같다고 판정해버린다.
5 === '5' // false
5 != '5'  // false - 숫자 5와 문자 5가 다르지 않다고 판정해버린다.
5 !== '5' // true
  • 명확한 비교를 위해 값과 타입까지 비교하는 일치 비교 연산자 === 또는 불일치 비교 연산자 !== 를 사용하자.

동등 비교 연산자의 암묵적 형변환

동등 비교 연산자는 좌항과 우항의 피연산자를 비교할 때 면저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다. (p 81)

// 암묵적 형변환되는 여러 안티패턴들 예시
5 == '5';  // 5 == 5 이므로 true
'0' == ''; // true == false 이므로 false 반환.
0 == '';   // false == false 이므로 true 반환.
0 == '0';  // 0 == 0 이므로 true 반환.
false == 'false'; // false == true 이므로 false 반환.
false == '0'; // true (왜..?)
false == null; // false (왜..?)
false == undefined; // false (왜..?)
  • 이해할 수 없는 비교 결과가 되기 때문에 값과 타입을 동시에 비교하는 일치/ 불일치 비교 연산자를 사용하여야 한다. 일치 비교(===) 연산자는 암묵적 형변환을 하지 않는다.

빌트인 함수 isNaN

  • NaN은 자신과 일치하지 않는 유일한 값이다. 따라서 비교연산자를 사용하여 NaN인지 여부를 판별할 수 없다.
  • 따라서 숫자가 NaN인지 조사하려면 빌트인 함수 isNaN을 사용하여 불린값을 반환받아야 한다.
NaN === NaN // false
undefined === undefined // true
null === null // true

isNaN(NaN); // true
let x = 10;
isNaN(x);   // false
isNaN(100); // false

7.4 삼항 조건 연산자

  • 조건식의 평가 결과에 따라 반환할 값을 결정한다.
  • 부수 효과는 없다. (부수 효과: 피연산자의 값을 변경시키는 것)
  • 기본 형태:
    • 조건식 ? true시 반환값 : false시 반환값
// 삼항 연산자의 기본 형태.(중첩 x)
// ? 이전까지의 부분이 if문에서의 조건식과 같다.
// : 을 기준으로, 왼쪽은 true일 경우의 반환값, 오른쪽은 false일 경우의 반환값이 된다.

const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';

중첩 삼항 연산자 예제

js-playground/중첩삼항연산자.html at master · ryan-kim-dev/js-playground

7.5 논리 연산자

드 모르간 법칙으로 표현식 단순화하기

// x가 아니면서 y도 아닌 것 -> 합집합의 여집합
!(x || y) === (!x && !y)
// x가 아니거나 y가 아닌 것 -> x와 y의 교집합을 제외한 나머지 전부
!(x && y) === (!x || !y)

7.6 쉼표 연산자

  • 평가 순서: 왼쪽 → 오른쪽 순서로 차례대로 피연산자를 평가.
  • 반환값: 마지막 피연산자의 평가 결과
let x, y, z; // undefined
x = 1, y = 2, z = 3; // 3

7.7 그룹 연산자

  • 동작: 소괄호를 사용하여 피연산자를 감싼 그룹의 표현식을 가장 먼저 평가. (수학하고 똑같다.)
  • 그룹 연산자의 연산자 우선순위가 가장 높기 때문에 연산자 간의 우선순위를 조절(먼저 계산해야 될걸 먼저 계산하도록)하기 위해 사용된다.
5 * 2 + 1;   // 11
5 * (2 + 1); // 15 

7.8 typeof 연산자

  • 반환값: 피연산자의 데이터 타입을 문자열로 반환한다.
  • 피연산자의 자료형과 정확하게 일치하지는 않는 경우가 있다. (ex: 배열, null)
  • 7가지 문자열 중 하나를 반환한다.
    • ‘string’
    • ‘number’
    • ‘boolean’
    • ‘undefined’
    • ‘symbol’
    • ‘object’ → typeof null; 도 ‘object’를 반환함.
    • ‘function’

7.9 지수(exponent) 연산자

  • 좌항의 피연산자를 밑(base)으로 하여 우항의 피연산자를 지수(exponent)로 거듭제곱한 숫자 값을 반환한다.
3 ** 3; // 27
2 ** 2.5; // 5.65685424949238
11 ** 0; // 1 (모든 수의 0제곱은 1이다.)
2 ** -2; // 0.25

7.10 그 외의 연산자

  • ?. : 옵셔널 체이닝 연산자(9.4.2절 참조)
  • ?? : null 병합 연산자(9.4.3절 참조)
  • delete 연산자: 프로퍼티 삭제(10.8절 참조)
  • new 연산자 : 생성자 함수를 호출하여 인스턴스를 생성할 때 인스턴스명 앞에 붙여서 인스턴스 생성.(17.2.6절 참조)
  • instanceof 연산자: 좌변의 객체가 우변의 생성자 함수와 연결된 인스턴스인지 판별.(19.10절 참조)
  • in 연산자: 프로퍼티 존재 확인.

7.11 연산자의 부수 효과

  • 부수 효과란?: 피연산자의 값을 변경함을 뜻함.
  • 대부분의 연산자는 부수 효과가 없으나, 할당 연산자, 증감 연산자와 delete 연산자는 다른 코드에 영향을 주는 부수 효과가 있다.

증감 연산자의 부수효과

#*7.1.2-단항-산술-연산자

7.12 연산자 우선순위

  • 최우선 순위는 그룹 연산자이다. 그리고 (거의)마지막 순위는 할당 연산자(15순위)이다.
  • 엄밀히 따지면 가장 마지막 우선순위는 , 연산자(16순위)이지만, 쉽게 기억하기 위해서 () 그룹 연산자가 최우선이고, 모든 연산이 끝난 후에 = += -= 할당 연산자가 마지막으로 평가된다고 생각하면 외우기 쉽다.
  • 모르겠으면 일단 무조건 먼저 실행되어야 할 내용을 소괄호로 묶어라.
  • 수학과의 공통점: 곱셈, 나눗셈(+ 나머지) 연산을 먼저 평가 후 덧셈, 뺄셈 연산을 평가한 후 좌항과 우항의 부등호 비교(평가).
// 3 ** 1 + 2를 27이 되도록 만들려면 어떻게 할까요?
3 ** 1 + 2;

// num에 할당되는 값은 무엇일까요?
let num = 1 + 2 * 3 > 6;

7.13 연산자 결합 순서

  • 결합 순서란? 좌항, 우항 중 어느쪽부터 평가를 수행할 것인지의 순서.
  • 좌항 → 우항 : 사칙연산, 나머지, 부등호 크기 비교, 논리연산 중 and와 or, in 연산자 등
  • 우항 → 좌항 : 증감, 할당, typeof, delete, 논리연산자 중 not, 삼항연산자 등
// 방향: ->
1 + 2 < 15 - 1 && 55 % 5 === 0; // true
// 일치 비교: 10순위, and: 12순위, or: 13순위

// 방향: <-
typeof arr1;
delete user.age;
++x;
--x;
728x90
저작자표시 비영리 변경금지

'개발 > Javascript' 카테고리의 다른 글

[자바스크립트] 호이스팅, 스코프, 클로저, spread, rest, 구조분해할당  (0) 2022.05.16
[자바스크립트] 원시 타입과 참조 타입  (0) 2022.05.12
[자바스크립트] 모던 자바스크립트 딥 다이브 5장 표현식과 문 내용정리  (0) 2022.05.08
[자바스크립트] 모던 자바스크립트 딥 다이브 4장 변수 내용 정리  (0) 2022.05.08
[자바스크립트] 고차함수와 콜백함수(작성중)  (0) 2022.04.28
    '개발/Javascript' 카테고리의 다른 글
    • [자바스크립트] 호이스팅, 스코프, 클로저, spread, rest, 구조분해할당
    • [자바스크립트] 원시 타입과 참조 타입
    • [자바스크립트] 모던 자바스크립트 딥 다이브 5장 표현식과 문 내용정리
    • [자바스크립트] 모던 자바스크립트 딥 다이브 4장 변수 내용 정리
    FE RYAN
    FE RYAN

    티스토리툴바