728x90
728x90
옵셔널 체이닝 연산자(Optional Chaining Operator), null 병합 연산자(Nullish Coalescing Operator) (ES11(ECMAScript2020))
들어가며
- ES11(ECMAScript2020)에서 도입된 옵셔널 체이닝 연산자와 null 병합 연산자에 대해 정리해본다.
- 옵셔널 체이닝 연산자와 null 병합 연산자는 모두 단축 평가(Shortcut Evaluation)을 위해 사용되는 연산자이다.
옵셔널 체이닝 연산자(Optional Chaining Operator, @?.@)
- 좌항의 피연산자가 @null@ 또는 @undefined@인 경우 @undefined@를 반환하고, 그렇지 않을 경우 우항의 프로퍼티 참조를 이어간다.
- 프로퍼티 참조 : 변수를 통해 변수값을 참조하듯이, 객체의 프로퍼티에 접근해 프로퍼티 값을 참조하는 것
- 옵셔널 체이닝 연산자 @?.@가 도입되기 이전에는 논리 연산자 @&&@를 사용한 단축 평가를 통해 변수가 @null@인지 @undefined@인지 확인했다.
var elem = null;
// elem이 Falsy 값이면 elem으로 평가하고, elem이 Truthy 값이면 elem.value로 평가
var value = elem && elem.value;
console.log(value); // null
논리 연산자 &&는 좌항 피연산자가 false로 평가되는 Falsy 값(false, undefined, null, 0, -0, NaN, '')이면 좌항 피연산자를 그대로 반환한다. 하지만, 0이나 ''은 객체로 평가될 때도 있다.
- 하지만 옵셔널 체이닝 연산자 @?.@는 좌항 피연산자가 @false@로 평가되는 Falsy 값(@false@, @undefined@, @null@, @0@, @-0@, @NaN@, @''@)이라도 @null@ 또는 @undefined@가 아니면 우항의 프로퍼티 참조를 이어간다.
var str = "";
// 좌항 피연산자가 false로 평가되는 Falsy 값이라도
// null 또는 undefined가 아니면 우항의 프로퍼티 참조를 이어간다.
var length = str?.length;
console.log(length); // 0
@null@ 병합 연산자(Nullish Coalescing Operator, @??@)
- 좌항의 피연산자가 @null@ 또는 @undefined@인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
- 변수에 기본값을 설정할 때 유용하다.
- Coalesce : (더 큰 덩어리로) 합치다.
// 좌항의 피연산자가 null 또는 undefined이면 우항의 피연산자를 반환하고,
// 그렇지 않으면 좌항의 피연산자를 반환
var foo = null ?? 'default string';
console.log(foo); // "default string"
- null 병합 연산자 @??@가 도입되기 이전에는 논리 연산자 @||@를 사용한 단축 평가를 통해 변수에 기본값을 설정했다.
논리 연산자 ||는 좌항 피연산자가 false로 평가되는 Falsy 값(false, undefined, null, 0, -0, NaN, '')이면 우항의 피연산자를 반환한다. 만약 Falsy 값인 0이나 ''도 기본값으로서 유효하다면 예기치 않은 동작이 발생할 수 있다.
// Falsy 값인 0이나 ''도 기본값으로서 유효하다면 예기치 않은 동작 발생 가능
var foo = '' || 'default string';
console.log(foo); // "default string"
- 하지만, null 병합 연산자는 좌항의 피연산자가 @false@로 평가되는 Falsy 값(@false@, @undefined@, @null@, @0@, @-0@, @NaN@, @''@)이라도 @null@ 또는 @undefined@가 아니면 좌항의 피연산자를 그대로 반환한다.
// 좌항의 피연산자가 Falsy 값이라도 null 또는 undefined가 아니면 좌항의 피연산자 반환
var fooo = '' ?? 'default string';
console.log(foo); // ""
728x90
728x90
'Programming > JavaScript' 카테고리의 다른 글
[JavaScript] 전개 연산자 (Spread Operator, ...) (0) | 2024.08.27 |
---|---|
[JavaScript] for 문 정리 (for, for...in, for...of, forEach, for await...of) (0) | 2024.08.25 |
[JavaScript] JSON(JavaScript Object Notation) 다루기 (0) | 2024.07.05 |
[JavaScript] Intl.NumberFormat 객체 (0) | 2024.06.28 |
[JavaScript] 비동기 프로그래밍(Asynchronous Programming) (0) | 2024.01.24 |
[JavaScript] 변수 재선언과 재할당 (var, let, const) (1) | 2024.01.18 |
[JavaScript] 스프레드 연산자(Spread Operator) (0) | 2023.12.14 |
[JavaScript] 디스트럭처링(Destructuring) (0) | 2023.12.14 |