옵셔널 체이닝을 사용하면 어떤 값에 접근할때 앞에 평가값이 null, undefined 이라면 평가를 멈추고 undefined 를 반환하여 에러를 막아주게 됩니다.
옵셔널 체이닝의 사용 형태에 대해서 알아보겠습니다.
1. 객체?.프로퍼티 : 객체가 존재한다면 객체.프로퍼티를 반환하고 존재하지 않는다면 undefined 를 반환 합니다.
2. 객체?.[프로퍼티] : 객체가 존재한다면 객체.[프로퍼티] 를 반환하고 존재하지 않는다면 undefined 를 반환 합니다.
3. 객체?.메서드() : 객체가 존재한다면 객체.메서드() 를 호출하고 존재하지 않는다면 undefined 를 반환 합니다.
4. 객체.메서드?.() : 메서드가 존재한다면 객체.메서드() 를 호출하고 존재하지 않는다면 undefined 를 반환 합니다.
5. 배열[행 index]?.[열 index] : 2차원 배열에서 행 index 가 범위에 있다면 배열[행 index][열 index] 를 반환하고 범위에 없다면 undefined 를 반환 합니다.
?. 의 첫번째 평가값은 선언되어 있어야 합니다. 선언되어 있지 않으면 에러가 발생 합니다.
?. 를 사용하면 중첩 프로퍼티에게 안전하게 접근 할 수 있습니다.
그럼 모든 상황에서 접근할때 ?. 를 사용하면 안전하고 좋지 않나? 라는 생각을 할 수도 있습니다.
접근하려는 값의 존재 여부를 확실하게 모를때 또는 존재하지 않아도 될때 그렇지만 에러는 발생하는것을 막고 싶을때 사용하면 좋습니다. 하지만 이미 존재 여부를 확실하게 알고 있는 평가값에도 ?. 를 사용하면 에러가 발생했을때 어디서 에러가 발생했는지 찾는데 많은 시간이 소요될 것 입니다.
옵셔널 체이닝을 사용하여 값을 읽기, 삭제를 할 수 있습니다. 하지만 쓰기는 불가능 합니다. 예를 들어 user 객체에 name 프로퍼티를 저장 할려고 합니다. user?.name = "kane"; 이렇게 사용하면 undefined = "kane"; 이 되기 때문에 ?. 를 사용해서 쓰기는 불가능 합니다.