[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) // {}
연산자 우선순위
- ()
- new (매개변수 존재) , [] 프로퍼티 접근 , () 함수 호출, ?. 옵셔널 체이닝 연산자
- new (매개변수 미존재)
- x ++ , x - -
- !x , +x, -x, ++x, —x, typeof, delete
- ** (이항 연산자중에 제일 높음)
-
- / %
- < , ≤ > ≥ , in , instanceof
- ==, ! = , === , ! ==
- ?? (null 병합 연산자)
- &&
-
- ? … : …
- 할당 연산자 (=, +=, -=.. )
- ,
연산자 결합 순서
-
좌항 → 우항 + - / % < ≤ > ≥ && . [] () ?? ?. in instanceof - 우항 → 좌항 ++ — , 할당 연산자, !x +x -x ++x —x typeof delete ? …: … **
Leave a comment