[240123] 7장 연산자

연산자 : “피연산자를 연산하여 새로운 값을 만든다.” , 동사의 역할

산술 연산자

  • 산술 연산이 불가능한 경우 NaN 반환

이항 산술 연산자

    • , = , * , / , %
  • 피연산자 값이 바뀌지 않고 새로운 값 만듬

단항 산술 연산자

  • ++ , — , +, -
  • 전위 증가/감소 연산자: 피연산자 값을 증가/감소한 후 다른 연산을 수행함
  • 후위 증가/감소 연산자: 다른 연산 수행한 후, 피연산자의 값을 증가/감소
let x = 5,
  result

// 선할당 후증가
result = x++
console.log(result, x) //5 6

// 선증가 후할당
result = ++x
console.log(result, x) // 7, 7
let x = "1"

// 문자열 숫자로 반환한다. 피연산자 변경X , 새로운 값 생성 부수효과 없다.
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 + true // 2 true는 1 타입으로 변환된다.
1 + null // 1 null은 0으로 타입 변환된다.
;+undefined // 숫자로 타입 변환되지 않는다. NaN

할당 연산자

  • = , +=, -=, *=, /=, %5
  • 할당문은 값으로 평가디는 표현식인 문으로서 할당된 값으로 평가된다.

비교 연산자

  • ==, === 느슨한 비교, 엄격한 비교
  • == : 좌항과 우항의 피연산자를 비교할 때 암묵적 타입 변환을 통해 타입 일치 시킴
  • ! = , ! == 동등비교, 일치 비교와 반대 개념
  • 주의 NaN 은 자신과 일치하지 않은 유일한 값이다.
NaN === NaN // false

// 빌트인 함수를 이용해서 비교한다.
Number.isNaN(NaN) // true
Number.isNaN(10) // false
Number.isNaN(1 + undefined) // true
Number.isNaN(undefined) // false
  • 주의 : JS에서는 양의 0 과 음의 0이 있는데 이를 비교하면 true를 반환함
0 === -0 // true
0 == -0 // true

**Object.is 메서드**

  • ES6에서 도입 ,예측 가능한 정확한 비교 결과를 반환한다.
;-0 === +0 // true
Object.is(-0, +0) // false

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

// 나머지는 === 과 동일하게 작동

대소 관계 비교 연산자

  • , < , > = , < =

삼항 조건 연산자

  • 조건식 ? 조건식이 true 일 때 반환 값, false 반환 값
  • 부수 효과 없다.
  • 삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식 문이다. (if else 문은 표현식이 아닌 문이여서 값처럼 사용할 수 없다.)

논리연산자

  •   논리합, && 논리곱, ! 부정(NOT)
// 드모르간의 법칙
!(x || y) === (!x && !y)
!(x && y) === (!x || !y)

쉼표 연산자

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

그룹 연산자

  • 소괄호(’()’) 로 피연산자를 감싸는 그룹 연산자는 자신의 피연산자인 표현식을 가장 먼저 평가함

typeof 연산자

  • 피연산자의 데이터 타입을 문자열로 반환한다.
  • 7가지 문자열 반환
    • string
    • number
    • boolean
    • undefined
    • symbol
    • object
    • function
  • null 을 반환하는 경우는 없다.
  • 함수인 경우 function → typeof 연산자가 반환하는 문자열은 7개의 데이터 타입과 정확히 일치하지는 않다.
typeof "" // string
typeof NaN // number
typeof null // object
typeof [] // object
typeof {} // object
typeof new Date() // object
typeof /test/gi //obejct
typeof function () {} // function
  • typeof 연산자로 null 값을 연산하면 obejct 반환하는데 js 의 첫번째 버전 버그임, 기존 코드에 영향을 줄 수 있어서 아직까지 수정되지 못하고 있음
  • null 타입 확인할때는 일치 연산자 (===) 사용하자
let foo = null
typeof foo === null // false
foo === null // true
  • 선언하지 않은 식별자를 typeof 연산자로 연산해보면 ReferenceError 가 발생하지 않고 undefined 반환함

지수 연산자

  • ES7 에서 도입
2 ** 2 // 4
2 ** 0 // 1
2 ** -2 // 0.25

// 도입전에는 Math.pow 메서드 사용
Math.pow(2, 2) -
  // 음수를 거듭제곱의 밑으로 사용하려면 괄호 사용
  5 **
    (2(
      // SyntaxError

      -5
    ) **
      2) // 25

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

그 외 연산자

  • 더 자세한 설명은 다른 장에서 봄
  • ?. 옵셔널 체이닝 연산자
  • ?? null 병합 연산자
  • delete 프로퍼티 삭제
  • new 생성자 함수를 호출할 때 사용하여 인스턴스를 생서
  • instanceof 좌변의 객체가 우변의 생성자 함수와 연결된 인스턴스인지 판별
  • in 프로퍼티 존재 확인

연산자의 부수효과

  • 부수효과가 있는 연산자는 할당연산자(=), 증가/감소 연산자(++/—), delete 연산자이다.
  • 다른 코드에 영향을 줌
let o = { a: 1 }
delete o.a
console.log(o) // {}

연산자 우선순위

  1. ()
  2. new (매개변수 존재) , [] 프로퍼티 접근 , () 함수 호출, ?. 옵셔널 체이닝 연산자
  3. new (매개변수 미존재)
  4. x ++ , x - -
  5. !x , +x, -x, ++x, —x, typeof, delete
  6. ** (이항 연산자중에 제일 높음)
    • / %

  • < , ≤ > ≥ , in , instanceof
  • ==, ! = , === , ! ==
  • ?? (null 병합 연산자)
  • &&
  •  
  • ? … : …
  • 할당 연산자 (=, +=, -=.. )
  • ,

연산자 결합 순서

  • 좌항 → 우항 + - / % < ≤ > ≥ &&   . [] () ?? ?. in instanceof
  • 우항 → 좌항 ++ — , 할당 연산자, !x +x -x ++x —x typeof delete ? …: … **

Categories:

Updated:

Leave a comment