[러닝자바스크립트] Ch5. 표현식과 연산자

hanjiyeon·2020년 10월 29일
0

러닝자바스크립트

목록 보기
5/5
post-thumbnail

표현식 : 값으로 평가될 수 있는 문, 결과가 값인 문, 무언가를 요청하는 것, 할당에 쓸 수 있음
표현식이 아닌 문 : 일종의 지시

let x;
x = 3*5;
y = x = 3*5;
  • 첫번째행은 선언문
  • 두번째행의 표현식은 2개
    1. 3*5 : 곱셈 표현식이고 결과는 15
    2. 값 15를 변수 x에 할당한 표현식, x만 값 15를 할당 받는 것이 아니라 전체 표현식의 결과도 값 15

연산자 우선순위 : 자바스크립트가 표현식을 평가하는 순서
연산자 표현식(연산자와 피연산자), 식별자 표현식(변수와 상수 이름), 리터럴 표현식

5.1 연산자

연산자 : 표현식의 명사에 대한 동사, 값을 만드는 행동

5.2 산술 연산자

뺄셈과 단항부정의 구분 ? 단항부정이 먼저 이루어지고 그 다음에 뺄셈을 함

%(나머지)를 음수에 적용하면 결과는 제수가 아니고 피제수의 부호를 따라감
cf> x(피제수) % y(제수)

증가와 감소 연산자는 덧셈보다 먼저 실행되며, 예제의 표현식음 모두 왼쪽에서 오른쪽으로 진행

let x = 2;
const r1 = x++ + x++; //2+3=5, x는4
const r2 = ++x + ++x; //5+6=11, x는6
const r3 = x++ + ++x; //6+8=14, x는 8
const r4 = ++x + x++;

5.3 연산자 우선순위

5.4 비교 연산자

일치함(===), 동등함(==), 대소관계의 세가지 타입
동등관계 : 두 값이 같은 객체를 가리키거나 같은 값을 갖도록 변환할 수 있다면 두 값을 동등하다고 함

5.5 숫자 비교

특별한 숫자형 값 NaN은 그 자신을 포함하여 무엇과도 같지않음
NaN === NaN, NaN == NaN 모두 false
숫자가 NaN인지 알아보려면 내장된 함수 isNaN 사용

let n = 0; 
while(true){
  n += 0.1;
  if(n === 0.3) break;
}
console.log(`Stopped at ${n}`);

0.1은 더블 형식으로 정확이 나타낼 수 없는 값이기 때문에 이 루프를 세번째 반복할 때 n의 값은 0.3000000..004이므로 유일한 종료조건 실패
→ 해결책 : Number.EPSILON(느슨한 비교), 관계연산자

let n = 0;
while(true){
  n += 0.1;
  if(Math.abs(n - 0.3) < Number.EPSILON) break;
}
console.log(`Stopped at ${n}`);

5.6 문자열 병합

자바스크립트는 피연산자의 타입을 보고 덧셈을 할지 문자열 병합을 할지 판단함
덧셈과 병합은 모두 왼쪽에 오른쪽으로 평가
피연산자 중 하나라도 문자열이면 문자열병합을, 두 값이 숫자형이면 덧셈을 함

3 + 5 + "8" // 문자열 "88"
"3" + 5 + 8 // 문자열 "358"

5.7 논리 연산자

거짓🙅🏻‍♀️

  • undefined
  • null
  • false
  • 0
  • NaN
  • ''(빈 문자열)

참 🙆🏻‍♀️

  • 모든 객체, valueOf() 메서드를 호출했을 때 false를 반환하는 객체도 참
  • 배열, 빈 배열
  • 공백만 있는 문자열 " "
  • 문자열 "false"

5.8 AND, OR, NOT

단축평가 : 두 값을 모두 평가 하지 않아도 될 때 나머지 값을 평가하지 않는 것
❗️ 중요한 이유 : 두 번째 피연산자에 부수효과가 있다 하더라도 단축 평가를 거치면 그 효과는 일어나지 않음

const skipIt = true;
let x = 0; 
const result = skipIt || x++;
  • 첫번째 피연산자 skipIt이 true이므로 result도 true
  • 세번째 행에서 단축평가가 일어나므로 증가연산자에 해당하는 표현식을 실행되지 않고 x의 값은 그대로 0
  • skipIt을 false로 바꾸면 논리 연산자의 두 피연산자를 모두 평가해야하고, x는 증가함. 이 때 후위증가가 아니라 전위증가라면 result의 값은 1

쉼표연산자 : 표현식을 결합하여 두 표현식을 평가한 후, 두번째 표현식의 결과를 반환
표현식을 하나 이상 실행해야하지만 값으로 필요한 것은 마지막 표현식의 결과뿐일 때 유용하게 사용

let x=0, y=10, z;
z=(x++, y++); //x와 y는 모두 1씩 늘어나지만 z의값은 10

💡 QUIZ

  • 빈 배열이 true인 이유는 객체이기 때문
  • typeOf null이 object인 이유?
    null이 포인터라서(객체도 주소를 나타내기때문에...)
  • 10 % 3 ? 자바스크립트에서는 -1, 수학적으로는 2(A=Q*B+C)
  • 빈 배열은 참이지만, []==false는 true
  • 표준에 쓰는 or : 포괄적 or (반대 - 배타적 or, xor)
  • xor은 두개의 피연산자가 다를 때만 true
    cf> 두 변수를 새로운 변수 선언 없이 바꾸는 방법 (xor통해서)
  • 자바스크립트에서 한줄로 변수 바꾸는 방법?
    해체할당 [b, a] = [a, b]

0개의 댓글