7.0 들어가며
연산자operator 란?
- 연산자operator : 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행해 하나의 값을 만든다.
- 피연산자 : 연산의 대상, 값으로 평가될 수 있는 표현식
7.1 산술 연산자
7.1.1 이항 산술 연산자
- 2개의 피연산자를 산술 연산하여 숫자 값을 만든다.
- 피연산자의 값이 바뀌지 않고 새로운 값을 만든다.
7.1.2 단항 산술 연산자
- 1개의 피연산자를 산술 연산하여 숫자 값을 만든다.
1 ) ++, - -연산자
- ++, - - 연산자는 피연산자의 값을 변경하는 암묵적 할당이 이뤄진다.
- 증가/감소(++/- -)연산자는 위치에 의미가 있다.
x++; // x = x + 1;
x--; // x = x - 1;
var x = 5, result;
// 선할당 후증가
result = x++;
console.log(result, x); // 5 6
// 선증가 후할당
result = ++x;
console.log(result, x) // 7 7
// 선할당 후감소
result = x--;
console.log(result, x); // 7 6
// 선감소 후 할당
result = --x;
console.log(result, x); // 5 5
2 ) + 단항 연산자
- 음수를 양수로 반전하지 않는다.
- 숫자타입이 아닌 피연산자를 숫자 타입으로 변환하여 반환한다.
- 피연산자를 변경하는 게 아니라 숫자 타입으로 변환한 값을 생성해서 반환한다.
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"
parseInt메서드와 Number 함수를 쓰지 않고 간단하게 문자열을 숫자로 바꿀 수 있다.
//const handleChange = e =>
// setAge(parseInt(e.target.value))
//const handleChange = e =>
// setAge(Number(e.target.value))
const handleChange = e =>
setAge(+e.target.value)
3 ) - 단항 연산자
- 피연산자의 부호를 반전한 값을 반환한다.
- 숫자타입이 아닌 피연산자를 숫자 타입으로 변환하여 반환한다.
- 부호를 반전한 값을 생성해 반환할 뿐 피연산자를 변경하는 것은 아니다.
// 부호를 반전한다.
-(-10); // 10
// 문자열을 숫자로 타입 변환한다.
-'10'; // -10
// 불리언 값을 숫자로 타입 변환한다.
-true; // -1
//문자열은 숫자로 타입 변환할 수 없으므로 NaN을 반환한다.
-'Hello' ; // NaN
7.1.3 문자열 연결 연산자
-
- 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
// 문자열 연결 연산자
'1' + 2; // '12'
1 + '2'; // '12'
// 산술 연산자
1 + 2; // 3
//true는 1로 타입 변환된다.
1 + true; //2
// false는 0으로 타입 변환된다.
1 + false; // 1
//null은 0으로 타입 변환된다.
1 + null; // 1
//undefined는 숫자로 타입 변환되지 않는다.
+undefined; //NaN
1 + undefined; //NaN
암묵적 타입 변환, 타입 강제 변환
: 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되는 것
7.2 할당 연산자
- 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당한다.
- 좌항의 변수에 값을 할당하므로 변수값이 변하는 부수효과가 있다.
할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가되며
이를 활용하여 연쇄 할당도 가능하다.
var a, b, c;
// 연쇄 할당. 오른쪽에서 왼쪽으로 진행된다.
a = b = c = 0;
console.log(a,b,c); // 0 0 0
7.3 비교 연산자
7.3.1 동등/일치 비교 연산자
- == 동등 비교 : x와 y의 값이 같음
- === 일치 비교 : x와 y의 값과 타입이 같음
- 동등비교 연산자는 좌항과 우항의 피연산자를 비교할 때 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다. → 예측하기 어려운 결과를 만들어냄으로 사용하지 않는 편이 좋다.
- 일치비교(===) 연산자는 좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한하여 true를 반환한다.
일치비교 연산자 주의점
- NaN은 자신과 일치하지 않아 비교하기 위해선 isNaN 빌트인 함수를 사용해야한다.
- 숫자 0도 양의 0과 음의 0을 구분하지 못하고 같다고 인식한다.
// 1. NaN
NaN === NaN; //false
//NaN은 자신과 일치하지 않는 유일한 값이며, 숫자가 NaN인지 조사하려면 isNaN을 사용한다.
isNaN(NaN); //true
isNaN(10); //false
isNaN(1 + undefined); //true
// 2. 양의 0, 음의 0
0 === -0; //true
0 == -0; //true
Object.is 메서드 (ES6)
===
, ==
(일치비교연산자, 비교연산자)는 +0과 -0을 동일하다고 평가한다. 또한 두개의 NaN을 비교하면 다른 값이라고 평가한다.
Object.is 메서드는 예측 가능한 정확한 비교 결과를 반환한다.
-0 === +0; //true
Object.is(-0, +0) // false
NaN === NaN; // false
Object.is(NaN, NaN); // true
Object.is() - JavaScript | MDN
7.4 삼항 조건 연산자 (ternary operator)
if ... else
문과 유사하게 처리할 수 있다.- 하지만 삼항조건연산자 표현식은 값처럼 사용할 수 있지만,
if ... else
문은 값처럼 사용할 수 없다.
삼항조건연산자 표현식은 값으로 평가할 수 있는 표현식인 문이다.
조건에 따라 어떤 값을 결정해야 한다면 if...else
문보다 삼항 조건 연산자 표현식을 사용하는 편이 유리하다.
하지만 조건에 따라 수행해야 할 문이 하나가 아니라 여러 개라면 if...else
문의 가독성이 더 좋다.
7.5 논리 연산자 logical operator
// 논리합 연산자 ||
true || true; // true
// 논리곱 연산자 &&
true && true // true
// 논리 부정 연산자 !
// 언제나 Boolean 값을 반환.
// 피연산자를 Boolean타입으로 암묵적 타입 변환함.
!true // false
드 모르간의 법칙을 활용해서 좀 더 가독성 좋은 표현식으로 변환할 수 있다.
!(x || y) === (!x && !y)
!(x && y) === (!x || !y)
7.6 쉼표 연산자
쉼표 연산자는 왼쪽 피연산자부터 차례대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면마지막 피연산자의 평가 결과를 반환한다.
var x, y, z;
x = 1, y = 2, z = 3; //3
7.7 그룹 연산자 ( )
- 그룹 연산자는 연산자 우선순위가 가장 높다.
7.8 typeof 연산자
- 피연산자의 데이터 타입을 문자열로 반환한다.
- "string", "number", "boolean", "undefined", "symbol", "object", "function"
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
✨typeof 연산자 주의할 점
null의 타입 체크할 땐, 일치연산자(===) 사용
- typeof 연산자로 null 값을 연산해보면 "null" 이 아닌 "object"를 반환한다.
- JS 첫번째 버전의 버그이며, 기존 코드에 영향을 줄 수 있기 때문에 아직까지 수정되지 못하고 있다.
- 따라서, null타입인지 확인할 때는 typeof연산자보단, 일치연산자를 사용하여 체크하는 게 낫다.
var foo = null; typeof foo === null; // false foo === null; //true
선언하지 않은 식별자는 에러가 아니라 undefined를 반환한다.
typeof undeclared; //undefined
7.9 지수 연산자 (ES7)
- 좌항의 피연산자를 밑(base)으로, 우항의 피연산자를 지수(exponent)로 거듭제곱하여 숫자 값을 반환
Math.pow
메서드와 같지만 이보다 더 가독성이 좋다.- 다른 산술 연산자와 마찬가지로 할당연산자와 함께 사용할 수 있다.
- 이항 연산자 중에서 우선순위가 가장 높다.
2 ** 2; // 4
2 ** 0 // 1
2 ** -2 // 0.25
// [음수를 거듭제곱의 밑으로 사용해 계산하려면 다음과 같이 괄호로 묶어야 한다.]
-5 ** 2;
// SyntaxError: Unary operator used immediately before exponentiation expression.
// Parenthesis must be used to disambiguate operator precedence
(-5) ** 2; // 25
7.10 그 외의 연산자
?.
- 옵셔널 체이닝 연산자??
- null 병합 연산자delete
- 프로퍼티 삭제new
- 생성자 함수를 호출할 때 사용하여 인스턴스를 생성instanceof
좌변의 객체가 우변의 생성자 함수와 연결된 인스턴스인지 판별in
프로퍼티 존재 확인
7.11 연산자의 부수 효과
부수효과가 있는 연산자
=
할당연산자- 변수 값이 변하는 부수 효과가 있으며, 해당 변수를 사용하는 다른 코드에 영향을 준다.
++
/--
증가/감소 연산자- 피연산자의 값이 재할당되어 변경된다.
delete
연산자- 객체의 프로퍼티를 삭제하는 부수효과가 있다.
'💻 DEV > JavaScript' 카테고리의 다른 글
[모던자바스크립트 Deep Dive] 09장 타입 변환과 단축평가 (0) | 2021.11.04 |
---|---|
[모던자바스크립트 Deep Dive] 08장 제어문 control flow statement (0) | 2021.11.04 |
[모던자바스크립트 Deep Dive] 06장 데이터 타입 (0) | 2021.11.04 |
[모던자바스크립트 Deep Dive] 05장 표현식과 문 (0) | 2021.11.04 |
[모던자바스크립트 Deep Dive] 04장 변수 (0) | 2021.11.04 |