Modern JavaScript Deep Dive 7장

younghyun·2022년 5월 12일
0

연산자

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

  • 피연산자
    값으로 평가될 수 있는 표현식

산술 연산자

피연산자를 대상으로 수학적 계산을 수행해 새로운 값을 만듦.
산술 연산 불가능할 경우 NaN반환

  • 이항 산술 연산 : 2개의 피연산자 산술 연산해 값을 생성. 부수 효과 없음
    ex) +(덧셈), -(뺄셈), *(곱셈), /(나눗셈), %(나머지)
  • 단항 산술 연산 : 1개의 피연산자를 산술 연산해 값을 생성.
    ex)
    ++(증가, 부수효과(암묵적 할당 : 피연산자 값 변경) O, 값 생성, 타입 변환 X)
    --(감소, 부수효과(암묵적 할당) O, 값 생성, 타입 변환 X)
    전위 증가/감소 연산 : 먼저 피연산자 값을 증가/감소 한 후, 다른 연산 수행
    후위 증가/감소 연산 : 먼저 다른 연산 수행한 후, 피연산자 값을 증가/감소
    +(반전 X, 부수효과 X, 값 생성, 타입변환 O, 피 연산자 중 하나 이상이 문자열 인 경우 문자열 연결 연산자로 동작 )
    -(반전 O, 부수효과 X, 값 생성, 타입변환 O)
1 + true // 2, true는 1로 타입 변환
1 + false // 1, false는 0으로 타입 변환
1 + null // 1, null은 0으로 타입 변환
1 + undefined // NaN, undefined는 숫자로 타입 변환 되지 않음.

암묵적 타입변환(타입 강제 변환) : 1 + true 연산 시 자바스크립트 엔진은 암묵적으로 true를 1로 타입 강제 변환

할당 연산자

우항에 있는 피연산자 평가 결과를 좌항에 변수에 할당. 변수 값이 변하는 부수 효과 있음.

비교 연산자

좌항, 우항의 피연산자를 비교한 다음 그 결과를 불리언 값으로 반환

  • 동등/일치 비교 연산자
    동등 비교 연산자는 결과 예측이 어렵고 실수하기 쉬움.

    == : 동등 비교, x == y (x와 y값이 같음), 부수효과 x, 암묵적 타입 변환
    === : 일치 비교, x === y (x와 y이 값의 타입이 같음), 부수효과 x
    != : 부동등 비교, x != y (x와 y의 값이 다름), 부수효과 x, 암묵적 타입 변환
    !== : 불일치 비교, x !== y (x와 yd의 값과 타입이 다름), 부수효과 x
NaN === NaN // false, NaN은 자신과 일치하지 않는 유일한 값
Number.isNaN(NaN) // true, Number.isNaN함수는 지정한 값이 NaN인지 확인하고, 불리언 값으로 반환
Number.isNaN(10) // false
Number.isNaN(1 + undefined) // true

0 === -0 // true
0 == -0 // true

Object.is(-0, +0) // false
Object.is(NaN, NaN) // true
  • 대소 관계 비교 연산자
    피연산자 크기를 비교해 불리언 값을 반환

삼항 조건 연산자

조건식 평가 결과에 따라 반환할 값 결정
삼항 조건 연산자 표현식은 값으로 사용 가능, if...else문은 값으로 사용 불가.

조건식(불리언 타입으로 평가될 표현식, 평가 결과가 불리언 값이 아니면 불리언 값으로 암묵적 타입 변환됨.)? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값

논리 연산자

우항과 좌항의 피연산자(부정 논리 연산자 경우 우항의 피연산자)를 논리 연산

|| : 논리합(OR), 부수 효과 X
&& : 논리곱(AND), 부수 효과 X
! : 부정(NOT), 부수 효과 X, 항상 불리언 값 반환, 피연산자가 불리언 값이 아니면 암묵적 타입 변환.

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

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

// 단축 평가
'Cat' && 'Dog'; // Dog

쉼표 연산자

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

그룹 연산자

소괄호로 피연산자를 감쌈. 자신의 피연산자인 표현식을 가장 먼저 평가함. 연산자 우선순위가 가장 높음.

tyepof 연산자

피연산자 데이터 타입을 문자열로 반환. 7가지 문자열 'string', 'number', 'boolean', 'undefined', 'symbol', 'object', 'function'중 하나 반환. 7개 데이터 타입과 정확히 일치 하지는 않음.

typeof NaN // number
typeof undefined // undefined
typeof Symbol() // symbol
typeof null // object : 버그. 아직까지 수정못하고 있음. null타입인지 확인할 때는 ===사용하면 됨.
typeof [] // obeject
typeof {} // object
typeof new Date() // object
typeof /test/gi // object
typeof function(){} // function
typeof undeclared // 선언하지 않은 식별자를 typeof 연산자로 연산하면 ReferenceError가 발생하지 않고, undefined를 반환함.

지수 연산자

좌항의 피연산자를 밑으로, 우항의 피연산자를 지수로 거듭 제곱해 숫자 값 반환.
결합순서는 우항에서 좌항 (우결합성)

2 ** 2; // 4
2 ** 2.5; // 5.656854
2 ** 0; // 1
2 ** -2; // 0.25
(-5) ** 2; // 25 음수를 거듭제곱 밑으로 사용해 계산하려면 괄호로 묶어야 함.

var num = 5;
num **= 2; //25, 지수 연산자는 다른 산술 연산자와 마찬가지로 할당 연산자와 함께 사용 할 수 있음.

2 * 5 ** 2;// 50, 지수 연산자는 이항 연산자 중에서 우선순위가 가장 높음. 

지수 연산자 도입 되기 전에는 Math.pow메서드 사용
Math.pow(2, 2); // 4
Math.pow(2, 2.5) // 5.656854
Math.pow(2, 0) // 1
Math.pow(2, -2) // 0.25

그 외 연산자

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

profile
선명한 기억보다 흐릿한 메모

0개의 댓글