-옵셔널 체이닝(optional chaining)이란 ?.
을 사용하면 프로퍼티가 없는 중첩 객체를 에러 없이 안전하게 접근할 수 있게 해주는것이다.
우리는 코드를 짜면서 객체내의 값을 접근하는 경우가 종종 있습니다.
하지만 항상 그 key값이 존재하는 경우 보다는 없는 경우도 있습니다.
다음과 같은 예시를 통해 알아보자
const students = {
mark: {
age: 20,
score: {
korean: 90,
english: 80,
math: 40
}
},
john: {
age: 20,
}
}
console.log(students.mark.score.english); // 80;
console.log(students.john.score.english); // TypeError: Cannot read properties of undefined (reading 'english')
이런 경우에 옵셔널 체이닝 연산자의 존재를 몰랐다면 아래와 같이 코딩을 할 수 있다.
console.log(students.john.score && students.john.score.english);
이렇게하면 score라는 key값에 접근이 가능할 때만 english값을 불러오려고 할 것이기 때문에 에러가 나지 않고 undefined만 반환하게 된다.
그럼 만약에 학생 정보에 john이라는 이름이 없어도 작동하게 하려면 어떻게 해야할까?
console.log(students.john && students.john.score && students.john.score.english);
점점 검사할 항목이 많아진다면 코드의 길이는 길어지고 해석하기 힘들 것이다.
그 불편함 속에서 생겨난 것이 옵셔널 체이닝 연산자이다.
옵셔널 체이닝을 이용해서 이 긴 코드를 아래와 같이 바꿀 수 있다.
console.log(students.john?.score?.english);
?. 연산자의 왼쪽에 있는 것을 평가한뒤 undefined 또는 null이 맞다면 undefined를 반환하고 평가가 끝나게 된다.
만약 아니라면 계속해서 평가가 이루어지게 된다.
이것만으로도 엄청 편리한 연산자라는 것을 알 수 있다.
const user = {};
const userAddress = user.info?.address ?? '모르는 주소'; // '모르는 주소'
const user = {
info: {
firstName: 'hello world'
}
};
const key = "firstName";
const userName = user.info?.[key];
console.log(arr?.[42]); // undefined
console.log(arr[42]); // TypeError: Cannot read properties of undefined (reading '42')
console.log(user?.info?.age) // 이렇게하면 user 객체가 꼭 있어야할 필요가 없다는 뜻입니다.
console.log(user.info?.age); // 이렇게하면 user 객체가 없다면 에러를 뱉을 것입니다.
옵셔널 체이닝 문법 ?.은 세 가지 형태로 사용할 수 있다.
?.를 계속 연결해서 체인을 만들면 중첩 프로퍼티들에 안전하게 접근할 수 있다.
?.은 ?.왼쪽 평가대상이 없어도 괜찮은 경우에만 선택적으로 사용해야 한다.
꼭 있어야 하는 값인데 없는 경우에 ?.을 사용하면 프로그래밍 에러를 쉽게 찾을 수 없으므로 이런 상황을 만들지 않도록 해야한다.