회사에서 프로젝트를 진행하면서 병원에서 의뢰한 '심박수 화면 출력'에 관련된 일을 하면서 화면에 의도하지 않은 null
값이 출력되는 것을 보게되었다.
코드의 예는 다음과 같다.
const heartRate = 심박수 계산식 || null
심박수가 측정이 되지 않으면 null
이 출력되라고 의도된 계산식인데, 0이라고 측정이 되면 0
이 출력이 되지 않고 null
이 출력이 되는 것이다.
폴리필 설정이 되지않아 따로 예외처리를 했지만 'nullish 병합 연산자
를 사용했으면 더 쉽고 코드가 가독성이 높았겠다.'라는 생각을 하며 nullish 병합 연산자
를 정리해 보려고 한다.
nullish 병합연산자는 ES6에서 등장한 문법이다.
nullish 병합연산자의 동작은 다음과 같다.
a
가 null
이나 undefined
가 아니면 a
b
위의 동작을 보면 생각나는 연산자가 있을 것이다.
바로 or 연산자 ||
이다.
nullish 병합연산자는 or연산자와 비슷하지만 결과는 확연한 차이가 나타나는 경우가 있다.
다음은 두 연산자의 차이점이다.
||
는 첫 번째 truthy 값을 반환하지만,??
는 첫 번째 정의된 값을 반환한다.
이 차이점은 0
을 null
과 undefined
와 구분 지어 다뤄야 할때 중요한 역할을 한다.
다음 예제로 둘의 차이를 확인해 보자.
const number = 0;
const a = number || 10;
console.log(a); // 10
const b = number ?? 10;
console.log(b); // 0
결과 값이 다른 이유를 위의 "or 연산자와의 차이" 파트의 글을 다시 읽으면서 다시 살펴보자
||
는 첫 번째 truthy 값을 반환하지만,??
는 첫 번째 정의된 값을 반환한다.
a의 값이 10이 나온이유
JavaScript에서 0은 falsy한 값이다.
||
은 첫 번째 truthy한 값을 반환하므로, a에 10을 할당한 것이다.
b의 값이 0이 나온 이유
??
은 첫 번째 '정의된' 값을 찾는다.
정의되지 않은 값은 'null'이나 'undefined'이다.
0은 'null'이나 'undefined'가 아니므로 b에 0을 할당한다.
이 파트는 참고자료의 JavaScript.info를 보면서 알게 되었다.
연산자 우선순위는 프로그래밍에서 수식 내에 여러 연산자가 함께 등장할때, 어느 연산자 부터 먼저 처리해야되는지 정해진 순서이자 규약이다.
우선순위가 빠른 연산자부터 실행된다.
??
의 우선순위는 5
로 꽤 낮은 편이라고 한다.
그래서 대부분의 연산자 보다 나중에 평가된다.
??
를 사용할때 의도한대로 프로그래밍이 되게 하려면 괄호와 함께 사용하는 것이 좋다.