20220823 TIL - JS

엄강우·2022년 8월 23일
0

TIL

목록 보기
39/43

연산자 우선 순위

var a = 42, b;
b = ( a++, a )   
b    // 43
b = a++, a
b    // 43
a    // 44

,연산자는 =연산자보다 우선순위가 낮다.

42 && 'foo' || false  // 'foo' 
43 || false && true   //  43

&&||는 순서대로 동작하는 것이 아니라 &&가 우선순위를 가진다.

단락평가

단락 평가는 &&||을 이용한 특성으로

  1. &&앞에 falsy한 값이 오면 뒤에 값을 평가하지 않고 앞의 값으로 인식한다.

    0 && 1     // 0
    0 && false // 0

    당연하게도 &&의 앞에 falsy한 값이 오면 뒤를 평가하지 않아도 무조건 falsy하기 때문이다.

  2. ||앞에 truthy한 값이 오면 뒤에 값을 평가하지 않고 앞의 값으로 인식한다.

    1 || 4     //  1
    1 || 0     //  1

    당연하게도 ||의 앞에 truthy한 값이 오면 뒤를 평가하지 않아도 무조건 truthy하기 때문이다.

삼항 연산자의 우선순위

삼항 연산자와 &&, ||의 우선순위는 &&, || 그리고 삼항연산자 순이다.

그리고 삼항 연산자는 일종의 결합의 순서를 가지는데 이는 우측 삼항연산자 부터 그룹핑 하여 실행 하도록 되어 있다.

그래서 삼항 연산자를 나열하여 사용하는 경우 작성자의 의도와 다르게 동작할 수 있기 때문에 eslint로 보호 하는 경우가 많다. ( 물론 가독성 때문도 있다.)

try ... finally

다들 try ... finally문에 대해서는 알고 있을 것이다. 하지만 finally문 이전에 return문이 등장 하면 어떻게 동작할지에 대해 생각해 본적 있을까?

function foo() {
  try {
    return 42
  } finally {
    console.log('finally')
  }
  console.log('여기는 못오지.')
}

var a = foo()
// finally

이러한 문제 때문에 finally문에 예외 문을 더 하면 앞에서 어떤 일을 했던 완전히 사장된다.

function foo() {
  try {
    return 42
  } finally {
    throw 43
  }
  console.log('여기는 못오지.')
}

var a = foo() // uncaught exception: 43
a; // undefined

finally문에 return이 있다면 finallyreturn이 우선순위 이지만 return이나 throw가 없다면 try 안의 return을 존중해준다.

profile
안녕하세요 프론트엔드 개발자를 꿈꾸는 엄강우입니다.

0개의 댓글