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을 존중해준다.