단축평가(short-circuit evaluation)
단축평가는 표현식을 평가하다가 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 말한다. 규칙은 아래와 같다.
true || anything // true
false || anything // anything
true && anything // anything
false && anything // false
단축 평가를 사용하면 if문을 대체할 수도 있다. 어떤 조건의 결과값이 truthy일 때 무언가 동작하게 만들고 싶다면 && 연산자를 사용해 if문을 대체해보자!
let done = true;
let message = '';
if (done) message = '완료';
message = done && '완료';
반대로 조건의 결과값이 falsy일 때 무언가 동작하게 하고 싶다면 || 연산자를 사용해 if문을 대체해보자!
let done = false;
let message = '';
if (!done) message = '아직';
message = done || '아직';
변수가 null, undefined가 아닌지 확인한 후에 하위 속성을 참조할 때, 단축 평가를 통해 에러를 방지할 수도 있다.
let el = null;
let val = el && el.val;
함수의 매개변수로 들어온 변수에 기본값을 설정해주고 싶을 때도 사용 가능하다.
function func(str) {
str = str || '';
}
옵셔널 체이닝 연산자 (optional chaining)
ES11부터 도입된 연산자이다. 표기 방식은 ?. 이런식으로 쓰는데, 왼쪽 피연산자가 null이나 undefined면 undefined를 반환하고, 그렇지 않으면 오른쪽의 프로퍼티 참조를 실행해 반환한다.
let el = null;
let val = el?.val;
console.log(val); // undefined
기존처럼 && 연산자를 사용할 경우, 왼쪽이 false로 평가되면 그 즉시 왼쪽 피연산자를 반환했다. 하지만 옵셔널 체이닝 연산자(?.)는 왼쪽 결과값이 falsy여도 null이나 undefined가 아니면 오른쪽까지 평가하고 결과를 반환한다. 덕분에 속성여부를 판단할 때 좀 더 간단히 표현이 가능해졌고, 참조 에러 가능성도 낮아지게 되었다.
let str = '';
let length = str && str.length;
console.log(length); // ''
let length = str?.length;
console.log(length); // 0
null 병합 연산자(nullish coalescing)
null 병합 연산자도 ES11부터 도입되었다. ?? 이렇게 사용하는데, 왼쪽 피연산자가 null이나 undefined면 오른쪽 피연산자를 반환하고, 아닌 경우에는 왼쪽의 피연산자를 반환한다. 변수에 기본값을 설정할 때 유용하게 쓸 수 있다.
let str = null ?? 'default';
console.log(str); // 'default'
기존처럼 || 연산자로 기본값을 설정했을 때를 생각해보자. ||는 왼쪽 피연산자가 falsy값이면 오른쪽 피연산자를 반환했는데, falsy값으로 취급되는 0 이나 ''(빈문자열)을 넣으면 예상치 못한 결과가 나오기도 했다. 하지만 ?? 연산자를 사용하면 이런 경우를 방지할 수 있다.
let str = '' || 'default';
console.log(str); // 'default'
let str = '' ?? 'default';
console.log(str); // ''
'Language > Javascript' 카테고리의 다른 글
Promise (2) 프로미스 체이닝, Promise.all, Async/Await (0) | 2021.02.02 |
---|---|
Promise (1) 콜백패턴의 문제점, Promise 생성자 (0) | 2021.02.02 |
암묵적, 명시적 타입 변환 (0) | 2021.01.29 |
유용하지만 위험한 화살표함수(=>) (0) | 2021.01.16 |
OOP (3) Javascript에서의 객체지향 프로그래밍 (ES6 이전의 Pseudoclassical한 방법) (0) | 2021.01.16 |
댓글