// 산술 연산자 5 * 4 // 20
// 문자열 연결 연산자 ' My name is ' + ' Lee ' // 'My name is Lee'
// 할당 연산자 color = 'red' // red
// 비교 연산자 3 > 5 // false
// 논리 연산자 true && false // false
// 타입 연산자 typeof 'Hi' // string
이항 산술 연산자 | 의 미 | 부수 효과 |
---|---|---|
+ | 덧셈 | X |
- | 뺄셈 | X |
* | 곱셈 | X |
/ | 나눗셈 | X |
% | 나머지 | X |
5 + 2; // 7 5 - 2; // 3 5 * 2; // 10 5 / 2; // 2.5 5 % 2; // 1
단항 산술 연산자 | 의 미 | 부수 효과 |
---|---|---|
++ | 증가 | O |
-- | 감소 | O |
+ | 효과 없음, 음수를 양수로 반전하지도 않음 | X |
- | 양수를 음수로, 음수를 양수로 반전한 값을 반환 | X |
증가/감소(++/--) 연산을 하면 피연산자의 값을 변경하는 암묵적 할당 이뤄짐
var x = 1;
// ++ 연산자는 피연산자의 값을 변경하는 암묵적 할당 이뤄짐 x++; // x = x + 1; console.log(x); // 2
// -- 연산자는 피연산자의 값을 변경하는 암묵적 할당 이뤄짐 x--; // x = x - 1; console.log(x); // 1
var x = 5, result;
// 선할당 후증가 (postfix increment operator) result = x++; console.log(result, x); // 5 6
// 선증가 후할당 (prefix increment operator) result = ++x; console.log(result, x); // 7 7
// 선할당 후감소 (postfix increment operator) result = x--; console.log(result, x); // 7 6
// 선감소 후할당 (prefix increment operator) result = --x; console.log(result, x); // 5 5
// 아무런 효과 없음 +10; // 10 +(-10); // -10
var x = '1';
// 문자열을 숫자로 타입 변환 console.log(+x); // 1 console.log(x); // "1"
// 불리언 값을 숫자로 타입 변환 x = true; console.log(+x); // 1 // 부수 효과 없음 console.log(x); // true
// 불리언 값을 숫자로 타입 변환 x = false; console.log(+x); // 0 // 부수 효과 없음 console.log(x); // false
// 문자열을 숫자로 타입 변환할 수 없어 NaN 반환 x = 'Hello'; console.log(+x); // NaN // 부수 효과 없음 console.log(x); // "Hello"
// 부호 반전 -(-10); // 10
// 문자열을 숫자로 타입 변환 -'10'; // -10
// 불리언 값을 숫자로 타입 변환 -true; // -1
// 문자열은 숫자로 타입 변환할 수 없어 NaN 반환 -'Hello'; // NaN
// 문자열 연결 연산자 '1' + 2; // '12' 1 + '2'; // '12'
// 산술 연산자 1 + 2; // 3
암묵적 타입 변환 or 타입 강제 변환
true를 숫자 타입인 1로 강제 변환한 후 연산 수행
// true는 1로 타입 변환됨 1 + true; // 2
// false는 0으로 타입 변환됨 1 + false; // 1
// null은 0으로 타입 변환됨 1 + null; // 1
// undefined는 숫자로 타입 변환되지 않음 +undefined; // NaN 1 + undefined; // NaN
할당 연산자 | 예 | 동일 표현 | 부수 효과 |
---|---|---|---|
= | x = 5 | x = 5 | O |
+= | x += 5 | x = x + 5 | O |
-= | x -= 5 | x = x - 5 | O |
*= | x *= 5 | x = x * 5 | O |
/= | x /= 5 | x = x / 5 | O |
%= | x %= 5 | x = x % 5 | O |
var x;
x = 10; console.log(x); // 10
x += 5; // x = x + 5; console.log(x); // 15
x -= 5; // x = x - 5; console.log(x); // 10
x *= 5; // x = x * 5; console.log(x); // 50
x /= 5; // x = x / 5; console.log(x); // 10
x %= 5; // x = x % 5; console.log(x); // 0
var str = 'My name is';
// 문자열 연결 연산자 str += 'Kim'; // str = str + 'kim'; console.log(str); // 'My name is Kim'
- 할당문은 값으로 평가되는 표현식인 문으로 할당된 값으로 평가
var x; // 할당문은 표현식인 문 console.log(x = 10); // 10
- 이런 특징을 활용해 여러 변수에 동일한 값 연쇄할당 가능
var a,b,c; // 연쇄 할당, 오른쪽에서 왼쪽으로 진행 // 1️⃣ c = 0 : 0으로 평가 // 2️⃣ b = 0 : 0으로 평가 // 3️⃣ a = 0 : 0으로 평가 a = b = c = 0; console.log(a, b, c); // 0 0 0
비교 연산자 | 의미 | 사례 | 설명 | 부수 효과 |
---|---|---|---|---|
== | 동등 비교 | x == y | x와 y의 값이 같음 | X |
=== | 일치 비교 | x === y | x와 y의 값과 타입이 같음 | X |
!= | 부동등 비교 | x != y | x와 y의 값이 다름 | X |
!== | 불일치 비교 | x !== y | x와 y의 값과 타입이 다름 | X |
동등 비교(==) 연산자는 좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교
// 동등 비교 5 == 5; // true // 타입은 다르지만 암묵적 타입 변환을 통해 일치시키면 동일 5 == '5'; // true
일치 비교(===) 연산자는 좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한해 true 반환 ( 암묵적 타입 변환 하지 않고 값 비교 )
// 일치 비교 5 === 5; // true // 암묵적 타입 변환을 하지 않고 값을 비교 // 값과 타입이 모두 같은 경우만 true 반환 5 === '5'; // false
동등 비교 연산자는 예측 어려움, 일치 비교 연산자는 예측이 쉬움
- 일치 비교 연산자에서 NaN과 숫자0 주의
NaN은 자신과 일치하지 않는 유일한 값, 숫자가 NaN인지 확인하려면 빌트인 함수 Number.isNaN 사용// NaN은 자신과 일치하지 않는 유일한 값 NaN === NaN; // false // Number.isNaN 함수는 지정한 값이 NaN인지 확인하고 결과를 불리언 값으로 반환 Number.isNaN(NaN); // true Number.isNaN(10); // false Number.isNaN(1 + undefined); // true
// 양의 0과 음의 0 비교, 일치 비교/동등 비교 모두 결과는 true 0 === -0; // true 0 == -0; // true
// 부동등 비교 5 != 8; // true 5 != 5; // false 5 != '5'; // false
// 불일치 비교 5 !== 8; // true 5 !== 5; // false 5 !== '5'; // true
대소 관계 비교 연산자 | 예제 | 설명 | 부수 효과 |
---|---|---|---|
> | x > y | x가 y보다 크다 | X |
< | x < y | x가 y보다 작다 | X |
>= | x >= y | x가 y보다 크거나 같다 | X |
<= | x <= y | x가 y보다 작거나 같다 | X |
// 대소 관계 비교 5 > 0; // true 5 > 5; // false 5 >= 5; // true 5 <= 5; // true
조건식 ? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값
(score >= 60) === false var result = score >= 60 ? 'pass' : 'fail'; (score >= 60) === true
[ ? ] 앞의 첫번째 피연산자는 조건식 (불리언 타입의 값으로 평가될 표현식)
조건식이 참이면 콜론(:) 앞의 두 번째 피연산자가 평가되어 반환
거짓이면 콜론(:) 뒤의 세번째 피연산자가 평가되어 반환
var x = 2; // 2 % 2는 0이고 0은 false로 암묵적 타입 변환 var result = x % 2 > '홀수' : '짝수'; console.log(result); // 짝수
논리 연산자 | 의미 | 부수 효과 |
---|---|---|
논리합 (OR) | X | |
&& | 논리곱 (AND) | X |
! | 부정 (NOT) | X |
// 논리 합 (||) 연산자 true || true; // true true || false; // true false || true; // true false || false; // false
// 논리 곱 (&&) 연산자 true && true; // true true && false; // false false && true; // false false && false; // false
// 논리 부정(!) 연산자 !true; // false !false; // true
논리 부정 연산자는 불리언 값을 반환, 단 피연산자가 반드시 불리언 값일 필요는 없음 불리언 값이 아니면 불리언 타입으로 암묵전 타입 변환됨
// 암묵적 타입 변환 !0; // true !'Hello'; // false
var x, y, z; x = 1, y = 2, z = 3; // 3
10 * 2 + 3; // 23 // 그룹 연산자를 사용하여 우선순위를 조절 10 * (2 + 3); // 50
typeof '' // string typeof 1 // number typeof NaN // number typeof true // boolean typeof undefined // undefined typeof Symbol() // symbol typeof null // object typeof [ ] // object typeof { } // object typeof new Data() // object typeof /test/gi // object typeof function () {} // function
❗️ 값이 null 타입인지 확인할땐 일치 연산자(===) 사용
(null이 아닌 object를 반환하는 버그 때문)var foo = null; typeof foo === null; // false foo === null; // true
❗️ 선언하지 않은 식별자를 typeof 연산자로 연산하면 ReferenceError가 아닌 undefined 반환
// undeclared 식별자를 선언하지 않음 typeof undeclared; // undefined
2 ** 2; // 4 2 ** 2.5; // 5.65685424949238 2 ** 0; // 1 2 ** -2; // 0.25
// 지수 연산자의 결합 순서는 우항에서 좌항, 우결합성을 가짐 2 ** (3 ** 2); // 512
❗️ 음수를 거듭제곱의 밑으로 사용해 계산하려면 괄호로 묶어야함
-5 ** 2; (-5) ** 2; // 25
❗️ 할당 연산자와 함께 사용 가능
var num = 5; num**= 2; // 25
❗️ 이항 연산자 중에서 우선순위가 가장 높음
2 * 5 ** 2; // 50
var x; // 할당 연산자는 변수 값이 변하는 부수효과, x 변수 사용하는 다른 코드에 영향 x = 1; console.log(x); // 1 // 증가/감소 연산자는 피연산자의 값을 변경하는 부수효과 // 피연산자 x 값이 재할당되어 변경, x 변수를 사용하는 다른 코드에 영향 x++; console.log(x); // 2 var o = {a : 1}; // delete 연산자는 객체의 프로퍼티를 삭제하는 부수효과, o 객체를 사용하는 다른 코드에 영향 delete o.a; console.log(o); // { }
우선순위 | 연산자 |
---|---|
1 | () |
2 | new(매개변수 존재), ., [](프로퍼티 접근), ()(함수 호출), ?.(옵셔널 체이닝 연산자) |
3 | new(매개변수 미존재) |
4 | x++, x-- |
5 | !x, +x, -x, ++x, --x, typeof, delete |
6 | ** (이항 연산자 중에서 우선순위 가장 높음) |
7 | *, /, % |
8 | +, - |
9 | <, <=, >, >=, in, instanceof |
10 | ==, !=, ===, !== |
11 | ?? (null 병합 연산자) |
12 | && |
13 | |
14 | ? ... : ... |
15 | 할당 연산자 (=, +=, -=, ...) |
16 | , |
결합 순서 | 연산자 |
---|---|
좌항 -> 우항 | +, -, /, %, <, <=, >, >=, &&, |
우항 -> 좌항 | ++, --, 할당연산자(=, +=, -, -=, ...), !x, +x, -x, ++x, --x, typeof, delete, ? ... : ..., ** |