var a = 42, b;
b = ( a++, a )
b // 43
b = a++, a
b // 43
a // 44
,
연산자는 =
연산자보다 우선순위가 낮다.
42 && 'foo' || false // 'foo'
43 || false && true // 43
&&
와 ||
는 순서대로 동작하는 것이 아니라 &&
가 우선순위를 가진다.
단락 평가는 &&
과 ||
을 이용한 특성으로
&&
앞에 falsy
한 값이 오면 뒤에 값을 평가하지 않고 앞의 값으로 인식한다.
0 && 1 // 0
0 && false // 0
당연하게도 &&
의 앞에 falsy
한 값이 오면 뒤를 평가하지 않아도 무조건 falsy
하기 때문이다.
||
앞에 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
이 있다면 finally
의 return
이 우선순위 이지만 return
이나 throw
가 없다면 try
안의 return
을 존중해준다.