자바스크립트 Deep Dive - 07장 연산자

ddullgi·2022년 9월 20일
0
post-thumbnail

Chapter7. 연산자


7.1 산술 연산자

  • 피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자 값을 만든다.
  • 산술 연산이 불가능한 경우, NaN을 반환한다.

이항 산술 연산자

이항 산술 연산자의미부수 효과
+더셈X
-뺄셈X
* 곱셈X
/나눗셈X
%나머지X

단항 산술 연산자

단항 산술 연산자의미부수 효과
++증가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;
var 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

+/- 단항 연산자는 암묵적인 타입 지정을 해준다.

result = "1"
console.log(+result) // 1
console.log(-result) // -1

result = true
console.log(+result) // 1

result = false
console.log(+result) // 0

result = "Hello"
console.log(+result) // NaN

문자열 연결 연산자

  • +연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
// 문자열 연결 연산자
"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 할당 연산자

  • 할당 연산자는 우항에 있는 피연산자의 평가 결과를 좌항에 있느 변수에 할당한다.
  • 할당 연산자는 좌항의 변수에 값을 할당하므로 변수 값이 변하는 부수효과가 있다.
할당 연산자동일 표현부수 효과
=x = 5x = 5O
+=x += 5x = x + 5O
-=x -= 5x = x - 5O
*=x *= 5x = x * 5O
/=x /= 5x = x / 5O
%=x %= 5x = x % 5O

할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가된다.


7.3 비교 연산자

  • 비교 연산자는 좌항과 우항의 피연산자를 비교한 다음 그 결과를 불리언 값으로 반환한다.
비교 연산자의미사례설명부수 효과
==동등 비교x == yx와 y의 값이 같음X
=== 일치 비교x === yx와 y의 값과 타입이 다름X
!=부동등 비교x != yx와 y의 값이 다름X
!==불일치 비교x !== yx와 y의 값과 타입이 다름X

  • 동등 비교(==) 연산자는 좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치 시킨 후 같은 값인지 비교한다.

  • 일치 비교(===) 연산자는 좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한하여 true를 반환한다.

  • NaN은 자신과 일치하니 않는 유일한 값이다.

    // NaN은 자신과 일치하지 않는 유일한 값이다. 
    // NaN인지 확인하기 위해서는 Number.isNaN을 사용해야 한다. 
    NaN === NaN // fasle
    Number.isNaN(NaN) // true
    
    // 양의 0과 음의 0도 같다는 것에 유의해야 한다. 
    0 === -0 // true
    0 == -0  // true

7.4 삼항 조건 연산자

  • 조건식의 평가 결과에 따라 반환할 값을 결정한다.

조건식 ? 조건식이 true일 때 반환할 값 : 조건식이 false일 때 반환할 값

var x = 10;

// 삼항 조건 연산자 예시
var result = x % 2 ? "홀수" : "짝수";
console.log(result); // 짝수

7.5 논리 연산자

  • 논리 연산자는 우항과 좌항의 피연산자를 논리 연산한다.
논리 연산자의미부수 효과
||논리합(OR)O
&&논리곱(AND)O
!부정(NOT)O

7.6 쉼표 연산자

  • 쉼표(,) 연산자는 왼쪽 피연산자부터 차례 대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면 평가 결과를 반환한다.
var x, y, z;

x = 1, y = 2, z = 3;

7.8 typeof 연산자

  • 피연산자의 데이터 타입을 문자열로 반환한다.
// typeof 연산자로 null을 연산해보면 "null" 이아닌 "object"를 반환하는 것에 주의하자
// 자바스크립트의 첫 번째 버전의 버그 => 하지만 기존코드에 영향 줄까봐 아직 수정이 안됨
// 그래서 null 타입인지 확인하기 위해 일치 연산자(===)를 사용해야 한다. 

const foo = null;
typeof foo === null;  // false
foo === null; // true

// 선언하지 않은 식별자에 typeof 연산자를 사용하면 RefreneceError가 발생하지 않고 undefined를 반환한다. 

typeof undeclared; // undefined



Object.is 메서드

앞에서 살편본 바와 같이 동등 비교 연산자(==)와 일치 비교 연산자(===)는 +0과 -0을 동DLF하다고 평가한다., 또한 동일한 값인 NANNan일 비교하면 다른 값 이라고 평가한다.

ES6에서 도입된 Oject.is 메서드는 다음과 같이 예측 가능한 정확한 비교결과를 반환한다. 그 외에는 일치 비교 연산자(==)와 동일하게 동작한다.


드 모르간의 법칙

논리 연산자로 구성된 복잡한 표현식은 가독성이 좋지 않아 한눈에 이해하기 어려울 때가 있다. 이러한 경우 드 모르간의 법칙을 활용하면 복잡한 표현식을 좀 더 가독성 좋은 표현식으로 변환할 수 있다.

!(x || y) === (!x && !y)
!(x && y) === (!x || !y)
profile
프론트엔드개발자를 꿈꾸는 예비 개발자

0개의 댓글