&&(논리곱) 연사자는 양 피연산자가 모두 true일 경우, true를 반환된다.
단축 평가에서 && 연산자는 좌항에서 우항으로 평가되며 && 연산자는 결과를 결정하는 우항의 피연산자 문자열을 그대로 반환한다.
'Cat' && 'Dog' // "Dog"
||(논리합) 연산자는 양 피연산자가 하나만 true일 경우, true를 반환한다.
단축 평가에서 || 연산자는 좌항에서 우항으로 평가되며 || 연산의 결과를 좌항의 문자열을 그대로 반환한다.
'Cat' || 'Dog' // "Cat"
논리 연산의 결과를 결정하는 피연사자를 타입 변환하지 않고 그대로 반환하는 것을 단축 평가라 한다.
단축 평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략한다.
: 객체를 가리키기를 기대하는 변수의 값이 객체가 아닌 null 또는 undefined인 경우 객체의 프로퍼티 참조시 에러가 발생하여 프로그램이 강제 종료되지만 단축 평가 사용 시 에러가 발생하지 않도록 할 수 있다.
var elem = null;
var value = elem && elem.value;
console.log("value의 값 : " + value); // null
: 함수를 호출할 때 인수를 전달하지 않으면 매개변수에 undefined가 할당되지만, 단축 평가를 사용해 기본값을 설정하여 undefined로 인한 에러를 방지할 수 있다.
function getStringLength(str) {
str = str || '';
console.log("문자열의 길이 : " + str.length);
}
getStringLength(); // 0
getStringLength('hi'); // 2
ES6에서는 매개변수의 기본값을 설정할 수 있다.
function getStringLength(str = '') {
console.log("문자열의 길이 : " + str.length);
}
getStringLength(); // 0
getStringLength('hi'); // 2
: ES11(ECMAScript 2020)에서 도입된 옵셔널 체이닝 연산자 ?. 는 좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티를 참조한다.
// elem이 null 또는 undefined 이면 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
var elem = null;
var value = elem?.value;
console.log("value의 값 : " + value); // undefined
elem = {value : 3};
value = elem?.value;
console.log("value의 값 : " + value); // 3
: ES11(ECMAScript 2020)에서 도입된 null 병합연산자 ?? 는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 우항의 피연산자를 반환한다.
var foo = null ?? 'default string';
console.log("foo의 값 : " + foo); // "default string"
// 좌항의 피연산자가 Falsy 값이라도 null 또는 undefined가 아니면 좌항의 피연산자를 반환한다.
foo = '' ?? 'default string';
console.log("foo의 값 : " + foo); // ''
// 이 경우 || 연산자를 사용하는 것이 유용하다.
// Falsy 값인 0이나 ''도 기본값으로 유효하다면 예기치 않은 동작이 발생할 수 있다.
foo = '' || 'default string';
console.log("foo의 값 : " + foo); // "default string"