이게 존재하나요? "아니오"면 undefined를 반환 후 평가 종료.
이게 존재하나요? "네"면 다음 단락을 평가
옵셔널 체이닝(optional chaining) ?.을 사용하면 프로퍼티가 없는 객체에 에러 없이 안전하게 접근할 수 있습니다.
?.은 ?.'앞’의 평가 대상이 undefined나 null이면 평가를 멈추고 undefined를 반환합니다.
?.는 존재하지 않아도 괜찮은 대상에만 사용해야 합니다.
?.은 연산자가 아닌 특별한 문법 구조체(Sysnatx construct) 이다.
<script>
let user = {}; // 주소 정보가 없는 사용자
alert(user.address.street); // TypeError: Cannot read property 'street' of undefined
</script>
<script>
// querySelector(...) 호출 결과가 null인 경우 에러 발생
let html = document.querySelector('.my-element').innerHTML;
</script>
명세서에 ?.이 추가되기 전엔 이런 문제들을 해결하기 위해 && 연산자를 사용하곤 했습니다.
<script>
let user = {}; // 주소 정보가 없는 사용자
alert( user && user.address && user.address.street ); // undefined, 에러가 발생하지 않습니다.
</script>
그런데 이렇게 AND를 연결해서 사용하면 코드가 아주 길어진다는 단점이 있습니다.
<script>
let user = {}; // 주소 정보가 없는 사용자
alert( user?.address?.street ); // undefined, 에러가 발생하지 않습니다.
</script>
<script>
let user = null;
alert( user?.address ); // undefined
alert( user?.address.street ); // undefined
</script>
<script>
delete user?.name; // user가 존재하면 user.name을 삭제합니다.
</script>
지우기는 가능하지만 쓰기는 불가능합니다.
<script>
1. obj?.prop : //obj가 존재하면 prop 반환, 없으면 undefined 반환
2. obj?.[prop] : //obj가 존재하면 prop 반환, 없으면 undefined 반환
3. obj?.method() : //obj가 존재하면 method()호출, 아니면 undefined 반환
4. obj.method?.() : //obj의 메서드 method가 존재하면 메소드 실행, 아니면 undefined 반환
</script>