비교적 새로 추가된 자바스크립트 문법으로 프로퍼티가 없는 중첩 객체를 에러없이 접근할 때 사용한다. 유저 정보를 담아두는 user
객체에 아무런 정보가 없는 상태에서 address
속성에 접근하려고 하면 아래처럼 타입 에러가 발생한다.
const user = {};
console.log(user.address.street)
// TypeError: Cannot read property 'street' of undefined
React나 Vue의 상태관리 라이브러리를 쓸 때 아직 스토어에 있는 정보를 다 불러오지 않은 시점에서 객체의 속성에 접근할 때도 비슷한 타입에러가 발생한다.
// selectedMall은 스토어에서 불러올 정보
// 아직 스토어에서 selectedMall 정보를 조회하지 않은 상태라면
// 아래 코드가 실행될 시점에선 타입에러가 발생한다
watch(
() => selectedMall.value,
(newValue, oldValue) => {
if (oldValue.id === newValue.id) {
return updateInboxState();
}
if (newValue.id) {
updateInboxState();
}
}
);
중첩 객체의 특정 프로퍼티에 접근할 때 거치는 속성들을 AND
연산자를 활용해 실제 해당 객체나 프로퍼티가 있는지 확인하여 타입에러를 피할 수 있다. 하지만 이 같은 방식은 코드가 매우 길어지는 단점이 존재한다.
const user = {};
console.log(user && user.address && user.address.street)
<aside> 💡 구형 브라우저에선 폴리필 필요
</aside>
옵셔널 체이닝은 속성을 명시하는 온점 앞에 물음표를 ?.
추가하는 방식으로 사용한다. 평가 대상이 undefined
거나 null
이면 평가를 멈추고 undefined
를 반환한다. 즉 접근하는 객체나 객체의 속성이 존재하지 않는다면 undefined
를 반환한다.
const user = {};
console.log(user?.address?.street); // undefined
const user = null;
console.log(user?.address); // undefined
?.
왼쪽 평가 대상에 값이 없으면 평가를 멈춘다. 이런 평가 방식을 단락 평가(short-circuit)라고 부른다. 왼쪽 ?.
의 평가를 멈췄다면 ?.
우측에 있는 부가동작도 실행하지 않는다.