221203 항해99 27일차 optional chaining(ft. nullish 병합 연산자)

요니링 컴터 공부즁·2022년 12월 3일
0
  • optional chaining 연산자 (?.)는 체인의 각 참조가 유효한지 명시적으로 검증하지 않고, 연결된 객체 체인 내에 깊숙이 위치한 속성 값을 읽을 수 있다.
  • ?. 연산자는 . 체이닝 연산자와 유사하게 작동하지만, 만약 참조가 nullish(null 또는 undefined)이라면, 에러가 발생하는 것 대신에 표현식의 리턴 값은 undefined로 단락된다. 함수 호출에서 사용될 때, 만약 주어진 함수가 존재하지 않는다면, undefined를 리턴한다.
  • 따라서 참조가 누락될 가능성이 있는 경우 연결된 속성으로 접근할 때 더 짧고 간단한 표현식이 생성된다. 어떤 속성이 필요한지에 대한 보증이 확실하지 않은 경우 객체의 내용을 탐색하는 동안 도움이 될 수 있다.
  • optional chaining은 선언되지 않은 루트 객체에 사용할 수 없지만, 정의되지 않은 루트 객체와는 함께 사용할 수 있다.

문법

  • obj?.prop
  • obj?.[expr]
  • arr?.[index]
  • func?.(args)

ex)
중첩된 구조를 가진 객체 obj가 있다. optional chaining이 없이 깊이 중첩된 하위 속성을 찾으려면, 다음과 같이 참조를 확인해야 한다.

let nestedProp = obj.first && obj.first.second;

optional chaining 연산자(?.)를 사용하여, obj.first.second 에 접근하기 전에 obj.first의 상태에 따라 명시적으로 테스트하거나 단락시키지 않아도 된다.

let nestedProp = obj.first?.second;

++ 비슷하게 생긴 연산자 중에 '??'라는 nullish 병합 연산자도 있다.

  • nullish 병합 연산자 ??를 사용하면 짧은 문법으로 여러 피연산자 중 그 값이 '확정되어있는' 변수를 찾을 수 있다.
  • a ?? b의 평가 결과는 다음과 같다.

    a가 null도 아니고 undefined도 아니면 a
    그 외의 경우는 b

ex)

let firstName = null;
let lastName = null;
let nickName = "바이올렛";

// null이나 undefined가 아닌 첫 번째 피연산자
alert(firstName ?? lastName ?? nickName ?? "익명의 사용자"); // 바이올렛

'??'와 '||'의 차이

  • ||는 첫번째 truthy 값을 반환한다.
  • ??는 첫번째 정의된(defined) 값을 반환한다.

ex)

let height = 0;

alert(height || 100); // 100
alert(height ?? 100); // 0

위와 같은 특징 때문에 0이 할당될 수 있는 변수를 사용해 기능을 개발할 땐 '||'보다 '??'가 적합하다.

참조:
Optional chaining
nullish 병합 연산자 '??'

0개의 댓글