nullish 병합연산자(“??”)

Updated:

nullish 병합연산자 (“??”)


최근 스펙에 추가된 문법으로 예전 브라우저에서는 허용되지 않음(폴리필 필요!)

nullish 병합연산자는 ??를 사용하면 짧은 문법으로 여러 피연산자 중 그 값이 “확정된” 변수를 찾을 수 있습니다.

value ?? com에 대한 해당 결과는 아래와 같습니다.

  • value가 “null”도 아니고 “undefined”도 아니면 value이고 그 조건에 해당한다면 com에 대한 값이 나올 것이다.

nullish 병합 연산자를 사용하지 않고 해당 코드를 작성하려면?

  • const result = (a ≠ null && a ≠ undefined) ? a : b
  • 해당 코드를 작성하니 병합 연산자를 사용하는 것이 코드도 간결해지는 것을 알 수 있습니다.


‘??’과’||’의 차이점

nullish 병합 연산자는 OR 연산자과 거의 비슷해 보입니다. 하지만 살펴보면 둘의 차이점을 알 수 있습니다.

  1. || 는 첫번째 truthy 값을 반환합니다.
  2. ?? 는 정의된 값(undefined와 null)이 아닌 값을 반환합니다.
  3. 1번2번 의 차이는 숫자 0 에서 차이점이 직결됩니다.
let value = 0;
console.log(value || 100); // '||'는 truthy가 아니기에 100이 출력
console.log(value ?? 100); // '??'은 undefinded와 null이 아니니 0 출력


연산자 우선순위

?? 연산자의 우선순위는 낮은 편입니다. ??=? 보다는 우선순위가 높지만 그외 다른 연산자 보다 우선순위가 낮기 때문에 나중에 평가됩니다.

그래서 복잡한 연산을 하는 경우 “괄호()”를 추가하는 것이 좋습니다!

let value = null;
let com = null;
// 연산자 우선순위가 낮기 때문에 ()를 추가!
let result = (value ?? 100) * (com ?? 50); // 5000


nullish의 제약사항

“안전성 이슈 때문에 ??&&||“함께 사용하지 못합니다.”

아래 코드를 봅시다.

let value = 1 && 2 ?? 3 // 해당사항은 문법에러 발생!

이러한 제약사항은 || 대신에 ?? 를 사용하면서 만드는 실수를 “방지하고자 명세에 추가된 사항” 입니다. 에러에 대한 제약사항을 피하고 싶다면 **괄호()** 를 사용합시다!

// 괄호를 사용함으로 제약사항을 피해가기 때문에 2가 출력된다.
let value = (1 && 2) ?? 3;


요약

  1. 병합 연산자를 사용하면 피연산자 중 “값이 할당된” 변수를 빠르게 찾을 수 있습니다.
  2. ?? 는 변수에 기본값을 할당하는 용도로 사용이 가능하다.
  3. ?? 의 우선순위는 ?= 는 높지만 그 외의 다른 연산자 보다는 우선순위가 낮습니다.
  4. ??을 괄호없이 ||&& 와는 사용하면 문법에러가 발생합니다.
// value의 값이 null로 할당되어 result변수의 값은 '값'이 출력된다.
const value = null;
const result = value ?? '';


참조

nullish 병합 연산자 ‘??’