단축 평가란 논리곱(&&
) 연산자와 논리합(||
) 연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환하는 것이다.
단축 평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것을 말한다.
단축 평가는 아래의 규칙을 따른다.
단축 평가 표현식 | 평가 결과 |
---|---|
true && anything | anything |
false && anything | false |
true || anything | true |
false || anything | anything |
// 논리곱(&&) 연산자
'Cat' && 'Dog' // 'Dog'
'false' && 'Dog' // false
'Cat' && false // false
// 논리합(||) 연산자
'Cat' && 'Dog' // 'Cat'
'false' && 'Dog' // 'Dog'
'Cat' && false // 'Cat'
null
또는 undefined
인 경우 객체의 프로퍼티를 참조하면 타입 에러가 발생한다.let elem = null;
let value = elem.value; // TypeError: Cannot read property 'value' of null
let elem = null;
// elem이 null이나 undefined와 같은 Falsy 값이면 elem으로 평가되고,
// elem이 Truthy 값이면 elem.value로 평가된다.
let value = elem && elem.value; // null
undefined
가 할당된다. 이때 단축 평가를 사용해 매개변수의 기본값을 설정하면 undefined
로 인해 발생할 수 있는 에러를 방지할 수 있다.// 단축 평가를 사용한 매개변수의 기본값을 설정
function getStringLength(str) {
str = str || '';
return str.length;
}
getStringLength(); // 0
getStringLength('hi'); // 2
// ES6의 매개변수의 기본값 설정
function getStringLength(str = '') {
return str.length;
}
getStringLength(); // 0
getStringLength('hi'); // 2
?.
는 좌항의 피연산자가 null
또는 undefined
인 경우 undefined
를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.let elem = null;
let value = elem?.value;
console.log(value); // undefined
&&
는 좌항 피연산자가 false
로 평가되는 Falsy 값이면 좌항 피연산자를 그대로 반환한다. 하지만 0
이나 ''
은 객체로 평가될 때도 있다.let str = '';
// 문자열의 길이(length)를 참조한다.
let length = str && str.length;
// 문자열의 길이(length)를 참조하지 못한다.
console.log(length); // ''
?.
는 좌항 피연산자가 false
로 평가되는 Falsy값이라도 null
또는 undefined
가 아니면 우항의 프로퍼티 참조를 이어간다.let str = '';
// 문자열의 길이(length)를 참조한다. 이때 좌항 피연산자가 false로 평가되는 Falsy 값이라도
// null 또는 undefined가 아니면 우항의 프로퍼티 참조를 이어간다.
let length = str?.length;
console.log(length); // 0
ES11(ECMAScript2020)에서 도입된 null
병합 연산자 ??
는 좌항의 피연산자가 null
또는 undefined
인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
null 병합 연산자 ??
는 변수에 기본값을 설정할 때 유용하다.
// 좌항의 피연산자가 null 또는 undefined이면 우항의 피연산자를 반환하고,
// 그렇지 않으면 좌항의 피연산자를 반환한다.
let foo = null ?? 'default string';
console.log(foo); // 'default string'
||
를 사용한 단축 평가의 경우 좌항의 피연산자가 false
로 평가되는 Falsy 값이면 우항의 피연산자를 반환한다.// 만약 Falsy 값인 `0`이나 `''`도 기본값으로서 유효하다면 예기치 않은 동작이 발생할 수 있다.
let foo = '' ?? 'default string';
console.log(foo); // ''
??
는 좌항의 피연산자가 false
로 평가되는 Falsy 값이라도 null
또는 undefined
가 아니면 좌항의 피연산자를 그대로 반환한다.let foo = '' ?? 'default string';
console.log(foo); // ''