• 연산자는 하나 이상의 표현식을 대상으로
    산술, 할당, 비교, 논리, 타입, 지수 연산 등으로 수행해 하나의 값을 만든다.
    이때 연산의 대상을 피연산자라 한다.
  • 피연산자는 값으로 평가될 수 있는 표현식이어야 한다.
    //산술 연산자
    5 * 4 // 20
    
    // 문자열 연결 연산자
    'My name is ' + 'Bambi' // My name is Bambi
    
    //할당 연산자
    color = 'red' // 'red'
    
    //비교 연산자
    3 > 5 // false
    
    //논리 연산자
    true && false // false
    
    //타입 연산자
    type of 'Hi' // string
  • 연산자는 값으로 평가된 피연산자를 연산하여 새로운 값을 만든다 라고 생각하면 된다.

👩🏻‍💻 7.1 산술연산자

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

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

    7.1.1 이항 산술 연산자

    • 이항 산술 연산자는 2개의 피연산자를 산술연산하여 숫자값을 만든다.

    • 어떤 산술연산을 해도 피연산자의 값이 바뀌는 경우는 없고,
      언제나 새로운 값을 만든다.

    이항 산술 연산자의미예제
    +덧셈5 + 2 → 7
    -뺄셈5 - 2 → 3
    *곱셈5 * 2 → 10
    /나눗셈5 / 2 → 2.5
    %나머지5 % 2 → 1

7.1.2 단항 산술 연산자

  • 단항 산술 연산자는 1개의 피연산자를 산술연산하여 숫자값을 만든다.

    단항 산술 연산자의미
    ++증가
    - -감소
    +어떠한 효과도 없다
    -양수를 음수로, 음수를 양수로
    • 이항 산술 연산자와 달리 증가/감소 연산자는
      피연산자의 값을 변경하는 부수 효과가 있다.

       var x  = 1;
       x++; // x = x+1이라는 암묵적 할당이 이루어집니다.
       console.log(x); // 2
       ```
      
    • 또한, 증가/감소 연산자는 위치에 의미가 있다.

  • 앞에 위치할 경우 전위 연산자라고 하며
    피연산자의 값을 먼저 증가/감소 시킨 뒤,
    다른 연산을 수행한다.

    var x = 5, result;
    
    // 선증가 후할당(prefix increment operator)
    result = ++x;
    console.log(result, x); // 6 6
    
    // 선감소 후할당 (prefix decrement operator)
    result = --x;
    console.log(result, x); // 5 5
  • 뒤에 위치할 경우 후위 연산자라고 하며,
    먼저 다른 연산을 수행 한 뒤,
    피연산자의 값을 증가/감소시킨다.

var x = 5, result;

// 선할당 후증가(postfix increment operator)
result = x++;
console.log(result, x); // 5 6

// 선할당 후감소(postfix decrement operator)
result = x--;
console.log(result, x); // 6 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"

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
  • 여기서 주의해야 할 점은 개발자의 의도와는 상관없이
    자바스크립트 엔진에 의해 암묵적으로 타입이 자동변환되기도 한다는 점이다.

    → 이를 암묵적 타입 변환 또는 타입 강제 변환이라고 한다.

Untitled


👩🏻‍💻 7.2 할당 연산자

  • 할당 연산자는 우항에 있는 피연산자의 평가 결좌를 좌항에 있는 변수에 할당한다
var x;

x = 10;
console.log(x); // 10

x += 5; // x = x + 5;
console.log(x); // 15

x -= 5; // x = x - 5;
console.log(x); // 10

x *= 5; // x = x * 5;
console.log(x); // 50

x /= 5; // x = x / 5;
console.log(x); // 10

x %= 5; // x = x % 5;
console.log(x); // 0

var str = 'My name is ';

// 문자열 연결 연산자
str += 'Lee'; // str = str + 'Lee';
console.log(str); // 'My name is Lee'
  • 할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가된다.
  • x = 10은 x에 할당된 숫자값 10으로 평가된다.
  • 이러한 특징을 이용하여 여러 변수에 동일한 값을 연쇄 할당 할 수 있다.
var a,b,c;
a = b = c = 0;
console.log(a,b,c); // 0 0 0

👩🏻‍💻 7.3 비교 연산자

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

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

7.3.1 동등/일치 비교 연산자

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

  • 하지만 비교하는 엄격성의 정도가 다르다.

  • 동등비교는 느슨한 비교를 하지만, 일치 비교는 엄격하다.

    비교 연산자의미설명
    x == y동등 비교x와 y의 값이 같음
    x === y일치 비교x와 y의 값과 타입이 같음
    x ! = y부동등 비교x와 y의 값이 다름
    x ! == y불일치 비교x와 y의 값과 타입이 다름
  • 동등비교는 암묵적 타입변환을 통하여
    좌항과 우항의 타입을 일치시킨 후 같은 값인지 비교한다.

  • 일치비교는 타입도 같고 값도 같은 경우에 한하여 true를 반환한다.

  • 하지만 NaN은 자신과 일치하지 않는 유일한 값이기 때문에
    숫자가 NaN인지 알기 위해서는 일치비교 연산자가 아닌
    Number.isNaN이라는 빌트인 함수를 사용해야 합니다.

    → 동등비교보다는 일치비교를 사용하는 것이 좋다.

💡 Object.is( )

  • ES6에서 도입된 메서드. 두 개의 값을 비교하여 두 값이 일치하는지 여부를 확인한다.
  • 엄격한 동등성을 확인할 때 사용된다.
  • Object.is()일치비교연산자와 동일하지만,
    NaN과 0 같이 일치비교연산자로 알기 어려운 것들을 확인할 때 사용한다.
  • 대부분의 상황에서는 일치비교연산자를 사용하는 것이 일반적이며,
    Object.is()는 이러한 특수한 경우에만 사용한다.
-0 === +0 // true
Object.is(-0,+0) // false

NaN === NaN // false
Object.is(NaN, NaN) // true

7.3.2 대소 관계 비교 연산자

  • 대소 관계 비교 연산자는 피연산자의 크기를 비교하여 불리언 값을 반환한다.
// 대소 관계 비교
5 > 0;  // -> true
5 > 5;  // -> false
5 >= 5; // -> true
5 <= 5; // -> true

👩🏻‍💻 7.4 삼항 조건 연산자

  • 삼항 조건 연산자는 조건식의 평가 결과에 따라 반환할 값을 결정한다.

조건식 ? true일때 값 : false일때 값

  • if…else문을 사용해도 삼항 조건 연산자와 유사하게 처리할 수 있다.

  • 하지만 삼항조건연산자는 값처럼 사용할 수 있지만,
    if…else문은 값처럼 사용할 수 없다.

    var x = 10;
    
    if...else 문은 **표현식이 아닌 문**이다. 
    따라서 값처럼 사용할 수 없다.
    var result = if (x % 2) {
    result = '홀수';
    } else { 
    result = '짝수'; };
    // SyntaxError: Unexpected token if
    
    삼항 조건 연산자 표현식은 **표현식인 문**이다.
    따라서 값처럼 사용할 수 있다.
    var result = x % 2 ? '홀수' : '짝수';
    console.log(result); // 짝수

👩🏻‍💻 7.5 논리 연산자

  • 논리 연산자는 우항과 좌항의 피연산자를 논리 연산한다.

  • || : 논리합 , 또는

    // 논리합(||) 연산자
    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

👩🏻‍💻 7.6 쉼표 연산자

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

    var x, y, z;
    x = 1, y = 2, z = 3; // 3
    
    ***이런식으로 활용할 수 있다.
    (1+=2,3+=2,5)
    let a = (obj, value) => (obj+=value, obj+=value, obj);
    a(1,2); // 5

👩🏻‍💻 7.7 그룹 연산자

  • 소괄호(’()’)로 감싸는 그룹 연산자는 자신의 피연산자인 표현식을 먼저 평가한다.

  • 따라서 연산자의 우선순위를 정할 수 있다.

10 * 2 + 3; // 23
10 * ( 2 + 3 ); // 50

👩🏻‍💻 7.8 typeof 연산자

  • typeof 연산자는 피연산자의 데이터 타입문자열로 반환한다.

  • ‘null’을 반환하는 경우는 없으며, 함수의 경우 ‘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"**
    버그가 있으므로 null의 타입을 확인하고 싶을경우
    일치연산자(===)를 사용하자.
    
    var foo = null;
    
    typeof foo === null; // -> false
    foo === null;        // -> true

👩🏻‍💻 7.9 지수 연산자

  • ES7에서 도입된 지수 연산자는 좌항의 피연산자를 밑으로,
    우항의 피연산자를 지수로 거듭제곱하여 숫자값을 반환한다.
    2 ** 2;   // -> 4
    2 ** 2.5; // -> 5.65685424949238
    2 ** 0;   // -> 1
    2 ** -2;  // -> 0.25
  • 지수 연산자가 도입되기 전에는 Math.pow를 사용했다.
   Math.pow(2, 2);   // -> 4
   Math.pow(2, 2.5); // -> 5.65685424949238
   Math.pow(2, 0);   // -> 1
   Math.pow(2, -2);  // -> 0.25
  • Math.pow보다 가독성이 좋다.
  • 음수를 거듭제곱의 밑으로 사용하기 위해서는 괄호로 묶어주어야 한다.
    -5 ** 2; // SyntaxError
    (-5) ** 2; // 25
  • 다른 산술연산자와 마찬가지로 할당 연산자와 함께 사용할 수 있다.
    var num = 5;
    num **= 2; // -> 25

👩🏻‍💻 7.12 연산자의 우선순위

  • 1순위는 ()이다.

😆 새로 알게됐거나 느낀 점 !

  • NaN은 자신과 일치하지 않는 유일한 값 !
  • Object.is()라는 메서드에 대해 처음 알았다.
    NaN과 0에 대한 엄격한 상황이 필요할 때 사용하는 메서드
  • 삼항조건연산자는 값을 반환해야 할 때 사용하며,
    if문은 값을 반환할 수 없는 문이다.
  • 언제나 연산자의 우선순위 1순위는 그룹연산자이다 !
profile
프론트엔드를 희망하고 있습니다.

0개의 댓글