[Javascript] Deep Dive 7장 연산자 - 1

Yuzu·2023년 6월 14일
0

7장 연산자 (operator)

연산자는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행해 하나의 값을 만든다.

  • 연산의 대상을 피연산자(operand)라 한다.
  • 피연산자는 값으로 평가될 수 있는 표현식이어야 한다.

7.1 산술 연산자 (arithmetic operator)

: 피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자 값을 만든다.

  • 산술 연산이 불가능할 경우 NaN을 반환한다.

1. 이항(binary) 산술 연산자

  • 2개의 피연산자를 산술 연산하여 숫자 값을 만든다.
  • 모든 이항 산술 연산자는 피연산자의 값을 변경하는 부수 효과가 없고 언제나 새로운 값을 만든다.
  • ex. 덧셈( + ), 뺄셈( - ), 곱셈( * ), 나눗셈( / ), 나머지( % )

2. 단항(unary) 산술 연산자

  • 1개의 피연산자를 산술 연산하여 숫자 값을 만든다.
  • ex. 증가( ++ ), 감소( -- ), 양수/음수 반전 ( - ), 그냥 ( + )

증가, 감소 ( ++, -- ) 연산자

  1. 피연산자의 값을 변경하는 부수 효과가 있다.
var x = 1;

x++; // x = x + 1;
console.log(x); // 2

x--; // x = x - 1;
console.log(x); // 1

=> ++, -- 연산자는 피연산자의 값을 변경하는 암묵적 할당이 이뤄진다.

  1. 증가, 감소 연산자는 위치에 의미가 있다.
  • 피연산자 앞에 위치한 전위 증가/ 감소 연산자(prefix increment/ decrement operator)는 먼저 피연산자의 값을 증가/ 감소시킨 후, 다른 연산을 수행한다.
  • 피연산자 뒤에 위치한 후위 증가/ 감소 연산자(postfix increment/ decrement operator)는 먼저 다른 연산을 수행한 후, 피연산자의 값을 증가/ 감소시킨다.
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

+ 단항 연산자

  • 피연산자에 어떠한 효과도 없다.
  • 숫자 타입이 아닌 피연산자에 사용하면 피연산자를 숫자 타입으로 변환하여 반환한다. 피연산자를 변경하는 것이 아니라 부수 효과는 없다.
x = true;
console.log(+x); // 1 
console.log(x); // true

x = false;
console.log(+x); // 0 
console.log(x); // false

x = 'Hello';
console.log(+x); // NaN, 문자열은 숫자로 타입 변환할 수 없다.
console.log(x); // "Hello"

- 단항 연산자

  • 피연산자의 부호를 반전한 값을 반환한다.
  • 숫자 타입이 아닌 피연산자에 사용하면 피연산자를 숫자 타입으로 변환하여 반환한다. 피연산자를 변경하는 것이 아니라 부수 효과는 없다.
-true; // -1
-'Hello'; // NaN

3. 문자열 연결 연산자

  • ' + ' 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
  • 그 외의 경우는 산술 연산자로 동작한다.
'1' + 2; // '12'

암묵적 타입 변환 (implicit coersion) or 타입 강제 변환 (type coersion)

: 자바스크립트 엔진이 암묵적으로 타입을 강제 변환한 후 연산을 수행함

1 + true; // 2, true는 1로 타입 변환
1 + false; // 1, false는 0으로 타입 변환
1 + null; // 1, null은 0으로 타입 변환

7.2 할당 연산자 (assignment operator)

: 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당한다.

  • 좌항의 변수에 값을 할당하므로 변수 값이 변하는 부수 효과가 있다.
1. x = 5	
2. x += 5	// x= x+5
3. x -= 5	// x= x-5
4. x *= 5	// x= x*5
5. x /= 5	// x= x/5
6. x %= 5	// x= x%5
  • 할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가된다.

연쇄 할당

여러 변수에 동일한 값을 연쇄 할당

var a, b, c;
a = b = c = 0;
console.log(a,b,c); // 0 0 0 

7.3 비교 연산자 (comparison operator)

: 좌항과 우항의 피연산자를 비교하여 그 결과를 불리언 값으로 반환한다.

  • if 문이나 for 문과 같은 제어문의 조건식에서 주로 사용한다.

1. 동등/ 일치 비교 연산자

동등 비교 연산자와 일치 비교 연산자는 좌항과 우항의 피연산자가 같은 값으로 평가되는지 비교해 불리언 값을 반환한다.

  • 동등 비교 연산자 (loose equality): 느슨한 비교, 값을 비교
    좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다. 결과를 예측하기 어려워 사용을 지양한다.

== : 동등 비교
!= : 부동등 비교

예시)
5 == '5'; // true
  • 일치 비교 연산자 (strict equality): 엄격한 비교, 값과 타입을 비교
    좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한하여 true를 반환한다.

=== : 일치 비교
!== : 불일치 비교

예시)
5 === '5'; // false
0 === -0; // true, 양의 0과 음의 0을 같게 본다.

NaN === NaN; // false, NaN은 자신과 일치하지 않는 유일한 값이다.
Number.isNaN(NaN); // true
Number.isNaN(1+undefined); // true

** Number.isNaN 함수는 지정한 값이 NaN인지 확인하여 결과를 불리언 값으로 반환한다.

Object.is 메서드

NaN 이나 0을 비교할 때 예측 가능한 정확한 비교 결과를 반환한다.
그 외에는 일치 비교 연산자(===)와 동일하게 동작한다.

Object.is(-0,+0); // false
Object.is(NaN,NaN); // true

2. 대소 관계 비교 연산자

: 피연산자의 크기를 비교하여 불리언 값을 반환한다.

대소 관계 비교 연산자: > , < , >= , <=


7.4 삼항 조건 연산자 (ternary operator)

: 조건식의 평가 결과에 따라 반환할 값을 결정한다. 부수 효과는 없다.

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

  • 조건식 : 불리언 타입의 값으로 평가될 표현식
  • 조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 암묵적 타입 변환된다.
  • 삼항 조건 연산자는 두 번째 피연산자 또는 세 번째 피연산자로 평가되는 표현식이다.
var x = 2;
var result = x % 2 ? '홀수' : '짝수';  // 0 이 false로 암묵적 타입 변환 , 값처럼 사용할 수 있다.
console.log(result); // 짝수
  • 삼항 조건 연산자 표현식은 조건문이다.
// if ... else 문을 사용하여 유사하게 표현
if ( x % 2 ) result = '홀수';
else		 result = '짝수';

-> var result에 할당하여 값처럼 사용할 수 없다. 
  • 삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식인 문이다.
  • 삼항 조건 연산자 표현식은 값처럼 사용할 수 있지만 if ... else 문은 표현식이 아닌 문으로 값처럼 사용할 수 없다.

7.5 논리 연산자 (logical operator)

: 우항과 좌항의 피연산자(부정 논리 연산자의 경우 우항의 피연산자)를 논리 연산한다.

|| : 논리합 (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

// 논리 부정(!) 연산자의 암묵적 타입 변환
!0; // true
!'Hello'; // false
  • 논리합 또는 논리곱 연산자 표현식의 평가 결과는 불리언 값이 아닐 수도 있다. 2개의 피연산자 중 어느 한쪽으로 평가된다.
// 단축 평가
'Cat' && 'Dog'; // 'Dog'

드 모르간의 법칙

: 논리 연산에서 논리합은 논리곱과 부정기호로, 논리곱은 논리합과 부정기호로 표현할 수 있음을 가리키는 법칙

  • 복잡한 표현식을 가독성 좋은 표현식으로 변환할 수 있다.
!(x || y) === (!x && !y)
!(x && y) === (!x || !y)
profile
냐하

0개의 댓글