[ES2020] ?. 연산자 - Optional Chaining
optional chaining을 지원하기 위해서 ES2020에서 추가된 문법인 ?.
연산자에 대해서 알아보도록 하겠습니다.
. 연산자를 통한 속성값 접근의 문제점
그동안 자바스크립트에서는 주로 .
연산자(chaining)를 사용해서 객체의 속성값에 접근했었습니다.
간단한 예로, user
객체의 name
속성의 first
속성값은 다음과 같이 접근할 수 있습니다.
> user = {name: {first: "John", last: "Doe"}}
> user.name.first
'John'
하지만 이렇게 여러 단계로 이루어진 객체를 탐색할 때는 항상 TypeError
가 발생할 확률이 생깁니다.
> user.address.street
Uncaught TypeError: Cannot read property 'street' of undefined
이를 방지하기 위해서 일반적으로 다음과 같은 방어 로직을 넣게 되는데 보시다시피 코드가 지저분하게 됩니다.
> user.address && user.address.street
undefined
그래서 기존에는 lodash
와 같은 유틸리티 라이브러리를 이용하여 이 문제를 해결했었습니다. 😝
import { get } from "lodash";
get(user, "address.street");
?. 연산자를 통한 안전한 속성값 접근
?.
연산자를 사용하면 지저분한 방어 로직이나 유틸리티 라이브러리 없이 안전하고 깔끔하게 속성값에 접근할 수 있습니다.
객체의 속성을 접근할 때 .
연산자 대신에 ?.
연산자를 사용하면, 해당 객체가 nullish 즉, undefined
나 null
인 경우에 TypeError
대신에 undefined
를 얻게 됩니다.
> user?.name?.first
'John'
> user?.address?.street
undefined
?.
연산자는 배열이나 함수에서도 사용할 수 있습니다.
> arr = null;
> arr?.[0]
undefined
> func = undefined
> func?.()
undefined
?? 연산자와 함께 사용하기
?.
연산자는 ES2020에서 함께 도입된 ??
연산자와 함께 사용하면 더욱 시너지를 발휘합니다.
nullish coalescing을 위해 사용되는 ??
연산자에 대한 내용은 관련 포스팅를 참고 바랍니다.
> user?.country ?? "Korea"
'Korea'
마치면서
2020년 현재 대부분의 최신 브라우저는 optional chaining을 지원하기 때문에 ?.
연산자를 사용할 수 있습니다.
Node.js의 경우 버전 14부터 지원하며, 그 이전 버전에서는 Babel과 같은 트랜스파일러(transfiler)를 통해서 접해볼 수 있습니다.
optional chaining에 대한 좀 더 자세한 내용은 관련 MDN 공식 문서를 참고바라겠습니다.