연산자
피연산자를 연산하여 새로운 값을 만들어 줌
산술 연산자
이항 산술 연산자
2개의 피연산자를 연산하여 숫자 값을 만듦
피연산자의 값을 바꾸지 않고 언제나 새로운 값을 만듬 (부수효과 [sideEffect]가 발생하지 않음)
1 + 2;
1 - 2;
1 * 2;
1 / 2;
1 % 2;
단항 산술 연산자
1개의 피연산자를 연산하여 숫자 값을 만듦 증가/감소 연산자는 부수효과가 발생함
let x = 1;
let result;
// 증가/감소 연산자
result = x++; // result: 1, x: 2
result = ++x; // result: 2, x: 3
result = x--; // result: 3, x: 2
result = --x; // result: 1, x: 1
// 숫자 에 + 연산자 사용
+10; // 10
+-10; // 10
// 숫자가 아닌 피연산자에 + 연산자 사용
let y = 1;
+y; // "1"
y = true;
+y; // 1;
y = false;
+y; // 0
y = 'aaa';
+y; // NaN
// - 연산자
-(-10); // 10
문자열 연결 연산자
let a = '1';
console.log(a + 2); // '12'
console.log(2 + a); // '21'
a = 1;
console.log(a + true); // 2, 1로 타입 변환
console.log(a + false); // 1, 0으로 타입 변환
console.log(a + null); // 1, 0으로 타입 변환
console.log(a + undefined); // NaN, 타입 변환 X
+연산자를 통해 서로 다른 데이터 타입을 연산할 경우 자바스크립트 엔진이 암묵적으로 타입을 자동 변환 시킴 (암묵적 타입변환 또는 타입 강제 변환)
할당 연산자
우항의 값을 좌항의 변수에 할당(부수효과 발생)
let a;
a = 10;
a += 10;
a -= 10;
a *= 10;
a /= 10;
a %= 10;
let string = 'string ';
string += 'number'; // string number
비교 연산자
좌항과 우항의 피연산자를 비교한 다음 불리언 값을 반환
동등 비교 연산자
-
동등 비교 : 값만을 비교하며, == 는 긍정, != 는 부정
x == y, x != y
- 동등 비교 연산자는 좌항, 우항의 피연산자를 비교하기 전에 암묵적 타입 변환을 통해 타입을 일치시키고 값을 비교
-
일치 비교 : 값과 타입을 비교하며 === 는 긍정, !== 는 부정
x === y, x !== y
- 일치 비교 연산자는 좌항, 우항의 피연산자가 값과 타입이 같을 때에만 비교의 결과를 반환
- 예외적으로 NaN === NaN은 false
Object.is 메서드 +0, -0을 동일한 값 NaN을 다른 값이라고 평가하는 데 비해 Object.is 는 예측 가능한 정확한 값을 반환함
Object.is(+0, -0); // false
Object.is(NaN, NaN); // true
대소 관계 비교 연산자
>, <, >=, <=
로 대소관계를 비교
삼항 조건 연산자
조건식 ? 조건식이 true일 경우의 반환 값 : 조건식이 false일 경우 반환값
if else 문과 유사하게 사용이 가능하지만 차이점은 삼항 조건 연산자 표현식은 값처럼 사용될 수 있지만 if else 문은 불가능하다(if else는 문이기 때문)
논리 연산자
좌항과 우항의 피연산자를 논리 연산. 부정 논리 연산자의 경우 우항이 대상
- || : 논리 합(OR)
- && : 논리 곱(AND)
- ! : 부정(NOT)
// 드모르간의 법칙을 사용하여 가독성을 높일 수 있음
!(a || b) === (!a && !b);
!(a && b) === (!a || !b);
쉼표 연산자
왼쪽 피연산자 부터 차례대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면 마지막 평가 결과를 반환
let a, b, c;
(a = 3), (b = 4), (c = 5); // 3
그룹 연산자
소괄호로 피연산자를 감싸면 가장 먼저 평가를 진행 (평가 우선순위를 조절 할 수 있음)
5 * 2 + 3; // 13
5 * (2 + 3); // 25
typeof 연산자
피연산자의 데이터 타입을 문자열로 반환함 반환 가능 문자열(‘string’, ‘number’, ‘boolean’, ‘undefined’, ‘symbol’, ‘object’, ‘function’)
- null 은 null이 아닌 object를 반환하므로 일치 연산자로 null 타입을 확인해야함
- 선언하지 않은 식별자를 typeof 로 연산하게되면 ReferrenceError가 발생하지 않고 undefined가 발생함
지수 연산자
ES7에서 도입 좌항의 피연산자를 밑으로 우항의 피연산자를 지수로 거듭제곱하여 계산
5 ** 2; // 25
// 지수 연산자 도입 이전에는 Math.pow 메서드를 사용
Math.pow(5, 2);
// 음수를 밑으로 사용할 경우에는 괄호로 묶어야함
(-5) ** 2; // 25
// 할당연산자와 함께 사용할 수 있음
let num = 5;
num **= 2; // 25
// 지수 연산자는 이항연산자중 우선순위가 가장 높음
2 * 5 ** 2; // 50
그 외의 연산자
옵셔널 체이닝 연산자
ES11에서 도입
?.
를 통해 표현
좌항의 피연산자가 null/undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어감
// 객체 프로퍼티 참조
const elem = null;
// 논리 연산자 :
let value = elem && elem.value; // null
// 옵셔널 체이닝 연산자 :
value = elem?.value; // undefined
// 예외 상황
const str = '';
const length = str && str.length; // '' 빈 문자열은 Falsy Value로 판단되기 때문에 우항까지 이어가지 못함
length = str?.length; // 0
논리곱(&&)
은 평가 후 좌항의 피연산자를 그대로 반환하는 반면,옵셔널 체이닝 연산자(?.)
는 객체를 가리키는 변수의 null/undefined가 아닌지 확인하고 프로퍼티를 참조
null 병합 연산자
ES11에서 도입.
??
를 통해 표현
좌항의 피연산자가 Falsy Value가 아닌 null/undefined인 경우 우항의 피연산자를 반환하고, 아니라면 좌항의 피연산자를 반환
// null 병합 연산자 :
let str = null ?? 'string value'; // 'string value'
// 논리 연산자 :
str = '' || 'string value'; // 'string value'
// 예외 상황
str = '' ?? 'string value'; // ''
연산자 우선순위
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Operator_Precedence