카테고리 없음

옵셔널 체이닝

ㅈ현 2022. 7. 9. 19:42
if (sensorA.type.pm10)
	...
    
if (sensorA.type.pm25)
	...

옵셔널 체이닝은 타입스크립트에만 있는 문법은 아니다. 최근 자바스크립트에도 옵셔널 체이닝이 쓰인다.

 

자바스크립트의 옵셔널 체이닝

이해를 돕기 위해 아래와 같은 객체 두개를 사용한다.

const sensorA = {
  "mac_addr" : "***",
  "type" : {
    "pm10" : {
      value: 123,
      avg_value: 50,
      max_value: 150,
      min_value: 30
    },
    "pm25" : {
      value: 123,
      avg_value: 50
    }
  }
}

const sensorB = {
  "mac_addr" : "***",
  "type" : {
    "pm10" : {
      value: 100,
      avg_value: 50,
    },
    "temp" : {
      value: 20,
      avg_value: 15,
      max_value: 23
    }
  }
}

위 예시에서 사용된 두개의 객체는 센서에 대한 객체이며, 각 센서는 mac_addr이란 필드와, type이란 필드를 가진다.

type필드는 센서가 측정할 수 있는 값들에 대한 정보를 가지며 각 값들은 (value, avg_value, max_value, min_value)중 1개 이상의 값을 가진다.

ex) sensorApm10max_value를 제공하지만, sensorBpm10max_value를 제공하지 않음.

 

이때 각 센서마다 어떠한 값을 가지는지 모르는 상태에서 우리는 값에 안전하게 접근하기위해 if문 같은 방법을 사용할 수 있다.

if (sensorA.type.["pm10"] && sensorA.type.["pm10"].max_value)
	...
    
if (sensorB.type.["pm25"] && sensorB.type.["pm25"].avg_value)
	...

이러한 if문을 사용하여, 해당값의 존재여부를 검사 후 해당값에 접근하는 방법을 통해 우리는 객체에 접근할 수 있다.

 

옵셔널 체이닝은 이 과정을 줄여줄 수 있다.

console.log(sensorA.type.pm10?.max_value ?? 0)
console.log(sensorB.type.pm25?.avg_value ?? 0)

 

이를 통해 첫번째 줄의 경우 pm10의 max_value가 존재하므로 150이라는 값을 리턴해 줄것이다.

하지만 두번째 줄의 경우 pm25라는 값을 가지지 않으므로, 0을 리턴해주게 될 것이다.

 

 

주로 사용되는 옵셔널 체이닝

A?.B?.C

가장 많이 사용되는 방법이며, 다음과 같다.

A가 존재한다면 B를 검사한다. 이후 B가 존재한다면 C를 리턴한다. 하지만 이때 C에대한 결과는 알 수 없다.

C가 만약 undefined이지만, 안전한 값을 사용해야 한다면 ?? 를 같이 사용해야한다.

ex) A?.B?.C ?? 0

 

A.B?.()

A객체에서 B라는 는 함수가 존재할때 실행이 되고, 없다면 undefined를 리턴하게 된다.