연산자란? 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산(operation)등을 수행해 하나의 값을 만든다.
피연산자와 연산자의 조합으로 이뤄진 연산자 표현식도 값으로 평가될 수 있는 표현식이다.
📄 피연산자 : 연산의 대상이며 값으로 평가될 수 있는 표현식
산술 연산이 불가능 할 경우, NaN을 반환한다. 연산자는 피연산자의 개수에 따라 이항 산술연산자와 단항 산술 연산자로 구분할 수 있다.
이항 산술 연산자 | 의미 | 부수효과 |
---|---|---|
+ | 덧셈 | 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 |
❗ 전위 증가/감소 연산자는 먼저 피연산자 값을 증가/감소시킴 후위 증가/감소 연산자는 수행한 후, 피연산자 값을 증가/감소시킴
let x = 5, result;
// 선할당 후증가
result = x++;
cossole.log(result, x); // 5, 6
// 선증가 후할당
result = ++x;
cossole.log(result, x); // 7, 7
// 선할당 후감소
result = x--;
cossole.log(result, x); // 7, 6
// 선감소 후할당
result = --x;
cossole.log(result, x); // 5, 5
문자열 연결 연산자
// 1. 문자열 연결 연산자
'1' + 2; // '12'
1 + '2'; // '12'
// 2. true는 1로 타입 변환된다.
1 + true; //2
// 3. flase는 0으로 타입 변환된다.
1 + flase; //1
// 4. null은 0으로 타입 변환된다.
1 + null; //1
// undifined는 숫자로 타입 변환되지 않는다.
+ undifined; // NaN
1 + undifined; // 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 |
var x;
x = 10;
console.log(x); // 10
x += 5;
console.log(x); // 15
x -= 5;
console.log(x); // 10
x *= 5;
console.log(x); // 50
x /= 5;
console.log(x); // 10
x %= 5;
console.log(x); // 0
// 문자열 연결 연산자
let str = "My name is ";
str += "Lee"; // str = str + 'Lee'
console.log(str); // 'My name is Lee'
좌항과 우항의 피연산자를 비교한 다음, 그 결과를 불리언 값을 반환한다.
if / for 문과 같은 제어문의 조건식에서 주로 사용된다.
비교 연산자 | 의미 | 사례 | 설명 | 부수효과 |
---|---|---|---|---|
== | 동등 비교 | 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'; // false
5 != '5'; // false
5 !== '5'; // true
false == '0' // true
0 == ''; // true
0 == '0'; // true
false == 'false' // false
flase = null // false
flase == undefined; // false
❗동등 비교(==)연산자는 예측하기 어려운 결과를 만들어낸다. 따라서 동등 비교 연산자는 사용하지 않는 편이 좋다. 대신 일치 비교(===) 연산자를 사용한다.
// 주의해야할것들 NaN, 0
NaN === NaN; // flase -> 자신과 일치하지 않는 유일한 값이다.
Number.isNaN(NaN); // true -> Number.isNaN을 사용하여 조사할 수 있다.
// 양의 0과 음의 0의 비교 모두 true임
0 === -0 // true
0 == -0 // true
// Object.is 메서드로 예측 가능한 정확한 비교 결과를 반환 할 수 있다.
-0 === +0; // true
Object.is(-0,+0); // false
NaN === NaN; // false
object.is (NaN,NaN)// true
let x = 2;
// 2 % 2 는 0이고 0은 false로 암묵적 타입 변환된다.
let result = x % 2 ? "홀수" : "짝수";
console.log(result); // 짝수
❗삼항 조건 연산자 와 if ... else문의 차이점 : 삼항 조건 연산자 표현식은 값처럼 사용할 수 있지만 if...elsse문은 값처럼 사용할 수 없다.
우항과 좌항의 피연산자를 논리 연산 한다.
논리 연산자 | 의미 | 부수효과 |
---|---|---|
논리합(OR) | X | |
&& | 논리곱(AND) | X |
! | 부정(NOT) | X |
// 논리합 연산자 (||) -> true 가 이김!
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 -> 문자열은 기본적으로 truthy 값이다. 따라서 불리언 값 true 로 간주된다.
// 단축평가
"Cat" && "Dog"; // Dog
왼쪽 피연산자부터 차례대로 피연산자를 평가하고 마지막 프연산자의 평가가 끝나면 마지막 피연산자의 평가 결과를 반환함
var x, y, z;
(x = 1), (y = 2), (z = 3); // 3
소괄호로 피연산자를 감싸는 그룹 연산자는 피연산자인 표현식을 가장 먼저 평가한다. 연산자를 사용하면 우선순위를 조절할 수 있다. 그룹 연산자 우선순위가 가장 높다.
10 * 2 + 3; //23
//그룹 연산자를 사용하여 우선순위 조절
10* (2 + 3); //50
typeof 연산자는 피연산자의 데이터 타입을 문자열로 반환한다.
typeof " "; // string
typeof 1; // number
typeof NaN; // number
typeof true; // boolean
typeof undefined; // undefined
typeof Symbol(); // symbol
typeof []; // object
typeof {}; // object
typeof new Date(); // object
typeof /test/gi; // object
typeof function () {}; // function
// null
typeof null; // object -> bug
var foo = null;
typeof foo === null; // false -> typeof foo 는 object 를 반환한다.
foo === null; // true
좌항의 피산자를 밑으로, 우항의 피연산자를 지수로 거듭 제고하여 숫자 값을 반환 한다.
2 ** 2; //4
2 ** 0 // 1
Math.pow(2,2); // 4
Math.pow(2,0) // 1
연산자 | 개요 |
---|---|
?. | 옵셔널 체이닝 연산자 |
?? | null 병합 연산자 |
delete | 프로퍼티 삭제 |
new | 생성자 함수를 호출할때 사용하여 인스턴스를 생성 |
instanceof | 좌변의 객체가 우변의 생성자 함수와 연결된 인스턴스인지 판별 |
in | 프로퍼티 존재 확인 |
여러 개의 연산자로 이뤄진 문이 실행될때 연산자가 실행되는 순서
우선순위 | 연산자 |
---|---|
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 | , |
연산자 좌항 또는 우항 부터 평가를 수행할 것인지 나타내는 순서를 말한다.
결합 순서 | 연산자 |
---|---|
좌항->우항 | +, -, /, %, <, <=, >, >=, &&, [], (), ??, ?., in, instanceof |
우항->좌항 | ++, --, 할당연산자, !x, +x, -x, ++x ,--x, typeof, delete, ? ... : ... |