short-circuit evaluation
표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 단축 평가라고 한다.
논리곱(&&
) 연산자와 논리합(||
) 연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환한다.
&&
)'Cat' && 'Dog'
우항의 피연산자를 평가해 보아야 표현식을 평가할 수 있다.
논리곱 연산자는 좌항에서 우항으로 평가가 진행된다.
즉, 우항의 피연산자가 논리곱 연산자 표현식의 평가 결과를 결정한다.
👉🏻 논리 연산의 결과를 결정하는 우항의 피연산자를 문자열 그대로 반환한다. (Dog
)
var elem = null;
var value = elem && elem.value; // null
👉🏻 좌항의 피연산자를 타입 변환하지 않고 그대로 반환한다. (null
)
||
)👉🏻좌항의 피연산자를 타입 변환하지 않고 그대로 반환한다.
ES11(ECMAScript2020)에서 도입
좌항의 피연산자가 null
또는 undefined
인 경우 undefined
를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
객체를 담을 변수가 null
또는 undefined
가 아닌지 확인하고 프로퍼티를 참조할 때 유용하게 쓰인다.
var elem = null;
var value = elem?.value; // undefined
&&
는 좌항 피연산자가 Falsy 값이면 좌항 피연산자를 그대로 반환하기 때문에 0이나 ''인 경우에도 좌항의 피연산자를 반환하므로, 0이나 ''이 객체로 평가될 경우 사용할 수 없다.nullish coalescing
ES11(ECMAScript2020)에서 도입
좌항의 피연산자가 null
또는 undefined
인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
변수에 기본값을 설정할 때 유용하다.
var foo = null ?? 'default string'; // "default string"
||
는 좌항 피연산자가 Falsy 값이면 우항의 피연산자를 그대로 반환하기 때문에 0이나 ''도 기본값으로서 유효한 상황에는 사용할 수 없다!
??
는 좌항의 피연산자가 Falsy 값이더라도 null
, undefine
만 아니라면 좌항의 피연산자를 그대로 반환한다.
객체의 프로퍼티를 참조할 때 객체가 담겨있어야 하는 변수에 객체가 아닌 null 또는 undefined인 값이 담겨있다면, 타입 에러가 발생하고 프로그램이 강제 종료된다.
단축 평가를 사용해 Truthy 값일 경우만 프로퍼티를 참조하게 해 에러를 방지할 수 있다.
var elem = null;
var value = elem.value; // TypeError
var value = elem && elem.value; //null
undefined
가 할당된다.undefined
로 인한 에러를 방지할 수 있다.function getStringLength(str) {
str = str || '';
return str.length;
}