- 연산자는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행해 하나의 값을 만든다. 이때 연산의 대상을 피연산자라 함.
- 피연산자는 값으로 평가될 수 있는 표현식이여야함. 그리고 피연산자와 연산자의 조합으로 이뤄진 연산자 표현식도 값으로 평가될 수 있는 표현식임.
// 산술 연산자
5 * 4 // 20
// 문자열 연결 연산자
'My name is ' + 'Lee' // 'My name is Lee'
// 할당 연산자
color = 'red' // 'red'
// 비교 연산자
3 > 5 // false
// 논리 연산자
true && false // false
// 타입 연산자
typeof 'Hi' // string
7.1 산술 연산자
수학적 계산을 수행해 새로운 숫자값을 만듬. 산술 연산이 불가능하면 NaN을 반환.
7.1.1 이항 산술 연산자
2개의 피연산자를 산술 연산하여 숫자 값을 만듬.
의미 | 이항 산술 연산자 |
---|---|
덧셈 | + |
뺄셈 | - |
곱셈 | * |
나눗셈 | / |
나머지 | % |
7.1.2 단항 산술 연산자
1개의 피연산자를 산술 연산하여 숫자 값을 만듬.
이항 산술 연산자와 달리 증가/감소 연산자는 피연산자의 값을 변경하는 사이드 이펙트가 있음.
단항 산술 연산자 | 의미 | 사이드 이펙트 |
---|---|---|
++ | 증가 | O |
– | 감소 | O |
+ | 아무효과없음 | X |
- | 양수/음수 반전 | X |
증가/감소 연산자는 위치에 의미가 있음
- 앞에 위치한 증가/감소 연산자는 먼저 피연산자의 값을 증가/감소시킨 후, 다른 연산을 수행함.
- 뒤에 위치한 증가/감소 연산자는 먼저 다른 연산을 수행한 후, 피연산자의 값을 증가/감소시킴.
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 decrement operator)
result = x--;
console.log(result, x); // 7 6
// 선감소 후할당(prefix decrement operator)
result = --x;
console.log(result, x); // 5 5
- 앞에 쓰는건 솔직히 처음 봄. 반성하자.
숫자 타입이 아닌 피연산자에 + 단항 연산자를 사용하면 피연산자를 숫자 타입으로 변환하여 반환함. 사이드 이펙트 없음
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
7.1.3 문자열 연결 연산자
+
연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
그외의 경우엔 산술 연산자로 동작한다.
// 문자열 연결 연산자
'1' + 2; // '12'
1 + '2'; // '12'
// 산술 연산자
1 + 2; // 3
// true는 1로 타입 변환된다. (암묵적 타입변환 or 타입 강제 변환)
1 + true; // 2
// false는 0으로 타입 변환된다.
1 + false; // 1
// null은 0으로 타입 변환된다.
1 + null; // 1
// undefined는 숫자로 타입 변환되지 않는다.
+undefined; // NaN
1 + undefined; // NaN
7.2 할당 연산자
우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당함. 좌항의 변수에 값을 할당하므로 값이 변하는 사이드 이펙트가 있음.
할당 연산자 | ex | 동일 표현 |
---|---|---|
= | x = 5 | x = 5 |
+= | x += 5 | x = x + 5 |
-= | x -= 5 | x = x - 5 |
*= |
x *= 5 |
x = x * 5 |
/= | x /= 5 | x = x / 5 |
%= | x %= 5 | x = x % 5 |
var x;
// 할당문은 표현식인 문이다.
console.log(x = 10); // 10
할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가된다. 위 예제의 할당문 x = 10은 x에 할당된 숫자 값 10으로 평가됨. 따라서 다음과 같이 할당문을 다른 변수에 할당할 수 있음. 이러한 특징을 활용해 여러
변수에 동일한 값을 연쇄 할당할 수 있음.
var a, b, c;
// 연쇄 할당. 오른쪽에서 왼쪽으로 진행.
// ① c = 0 : 0으로 평가된다
// ② b = 0 : 0으로 평가된다
// ③ a = 0 : 0으로 평가된다
a = b = c = 0;
console.log(a, b, c); // 0 0 0
7.3 비교 연산자
비교 연산자는 좌항과 우항의 피연산자를 비교하고 그 결과를 불리언 값으로 반환함.
if, for 같은 제어문의 조건식에서 주로 사용함
7.3.1 동등/일치 비교 연산자
같은지 확인
비교 연산자 | 의미 | 설명 |
---|---|---|
== | 동등 비교 | 타입에 관계없이 값이 같은지 확인 |
=== | 일치 비교 | 값과 타입이 같은지 확인 |
!= | 부동등 비교 | 값이 다름 |
!== | 불일치 비교 | 값과 타입이 다름 |
동등과 부동등은 사실 사용해본 기억이 없다. 여러 선배분들께 여쭤봐도 마찬가지. | ||
일치, 불일치를 사용하여 정확한 타입까지 검사해 오류를 줄이자! |
일치 비교 연산자에서 NaN은 주의해야함.
NaN === NaN; // false
//Number.isNaN()을 쓸것
Number.isNaN(NaN); // true
숫자 비교 시 0과 -0은 같은 걸로 취급함.
0 === -0; // true
0 == -0; // true
Object.is는 좀 더 정확한 비교가 가능
-0 === +0; // true
Object.is(-0, +0); // false
NaN === NaN; // false
Object.is(NaN, NaN); // true
자세한 내용 -> https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/is
7.3.2 대소 관계 비교 연산자
대소 관계 비교 연산자는 피연산자의 크기를 비교하여 불리언 값을 반환함.
대소 관계 비교 연산자 | 예제 | 설명 |
---|---|---|
> | x > y | x가 y보다 큼 |
< | x < y | x가 y보다 작음 |
>= | x >= y | x가 y보다 크거나 같음 |
<= | x <= y | x가 y보다 작거나 같음 |
// 대소 관계 비교
5 > 0; // true
5 > 5; // false
5 >= 5; // true
5 <= 5; // true
7.4 삼항 조건 연산자
삼항 조건 연산자는 조건식의 평가 결과에 따라 반환할 값을 결정함
조건식 ? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값
var x = 2;
// 2 % 2는 0이고 0은 false로 암묵적 타입 변환된다.
var result = x % 2 ? '홀수' : '짝수';
console.log(result); // 짝수
7.5 논리 연산자
논리 연산자 | 의미 |
---|---|
|| | 논리합(OR) |
&& | 논리곱(AND) |
! | 부정(NOT) |
// 논리합(||) 연산자
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
-
원리가 궁금하면 비트 논리 연산 결과를 보면 됨 -> https://blog.naver.com/kks227/60198878377
-
논리 부정(!) 연산자는 언제나 불리언 값을 반환함. 단, 피연산자가 불리언 값일 필요는 없음.
-
논리합 또는 논리곱 연산자 표현식의 평가 결과는 불리언 값이 아닐 수 있음.
7.6 쉼표 연산자
- 왼쪽 피연산자부터 차례대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면 마지막 결과를 반환
var x, y, z;
x = 1, y = 2, z = 3; // 3
7.7 그룹 연산자
- 소괄호로 피연산자를 감싸는 그룹 연산자는 자신의 피연산자인 표현식을 가장 먼저 평가한다.
우선순위를 조절할때 사용. - 얘만 잘 써도 평가식에서 순서 문제가 생길일은 없지 않을까?
10 * 2 + 3; // 23
// 그룹 연산자를 사용하여 우선순위를 조절
10 * (2 + 3); // 50
7.8 typeof 연산자
- 피연산자의 데이터 타입을 반환
- string, number, boolean, undefined, symbol, object, function 중 하나를 반환
- 7개의 데이터 타입과 정확히 일치하지 않음 주의(어째서??)
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 Date() // "object"
typeof /test/gi // "object"
typeof function () {} // "function"
- 값이 null 타입인지 확인이 필요한 경우 일치 연산자(
===
) 사용. - 선언하지 않은 식별자는 undefined 반환 주의
7.9 지수 연산자
좌항의 피연산자를 밑으로 우항의 피연산자를 지수로 거듭제곱한다.
2 ** 2; // 4
2 ** 2.5; // 5.65685424949238
2 ** 0; // 1
2 ** -2; // 0.25
음수를 거듭제곱의 밑으로 사용하려면 괄호로 묶고 사용할 것
(-5) ** 2; // 25
다른 산술 연산자와 마찬가지로 할당 연산자와 함께 사용할 수 있음
var num = 5;
num **= 2; // 25
지수 연산자는 이항 연산자중에 우선 순위가 가장 높음
2 * 5 ** 2; // => 2 * 25 => 50
7.10 그 외의 연산자
기타 연산자는 다른 장에서 살펴보자
7.11 연산자의 부수 효과(사이드 이펙트)
할당 연산자(=), 증가/감소 연산자(++, --), delete 연산자는 사이드 이펙트가 있음.
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); // {}
7.12 연산자 우선순위
사실 알 필요가 있나 싶음 😆 헷갈리면 그룹 연산자를 활용하자!
7.13 연산자 결합 순서
여기도 마찬가지 생략
'공부공부 > JS 딥다이브' 카테고리의 다른 글
[js 딥다이브] 09장 타입변환과 단축평가 (0) | 2023.10.16 |
---|---|
[js 딥다이브] 08장 제어문 (0) | 2023.10.16 |
[js 딥다이브] 06장 데이터 타입 (0) | 2023.10.16 |
[js 딥다이브] 05장 표현식과 문 (0) | 2023.10.16 |
[js 딥다이브] 04장 변수 (0) | 2023.10.16 |