nullish 병합 연산자 ??를 사용하면 피연산자 중 ‘값이 할당된’ 변수를 빠르게 찾을 수 있습니다.
??는 변수에 기본값을 할당하는 용도로 사용할 수 있습니다.
<script>
// height가 null이나 undefined인 경우, 100을 할당
height = height ?? 100;
</script>
??의 연산자 우선순위는 대다수의 연산자보다 낮고 ?와 = 보다는 높습니다.
괄호 없이 ??를 ||나 &&와 함께 사용하는 것은 금지되어있습니다.
<script>
// 아래 두 코드는 동일한 동작을 합니다.
x = a ?? b //훨씬 짧죠?
x = (a !== null && a !== undefined) ? a : b;
</script>
firstName, lastName, nickName이란 변수에 사용자 이름이나 별명을 저장하는데, 사용자가 아무런 정보도 입력하지 않는 케이스도 허용한다고 해보겠습니다.
화면엔 세 변수 중 실제 값이 있는 변수의 값을 출력하는데, 세 변수 모두 값이 없다면 '익명의 사용자’가 출력되도록 해보죠.
<script>
let firstName = null;
let lastName = null;
let nickName = "두찌";
//let nickName = null; //nickName도 null이나 undefined라면 alert창에 익명의 사용자 출력
// null이나 undefined가 아닌 첫 번째 피연산자 nickName(두찌)
alert(firstName ?? lastName ?? nickName ?? "익명의 사용자"); // alert에 두찌 출력
</script>
<script>
height = height ?? 100; //height에 값이 정의되지 않은경우 height엔 100이 할당됩니다.(100이라는 값이 할당됐기 때문에)
</script>
<script>
let height = 0;
alert(height || 100); // 100
alert(height ?? 100); // 0
</script>
이런 특징 때문에 0이 할당될 수 있는 변수를 사용해 기능을 개발할 땐 ||보다 ??가 적합합니다.
<script>
let height = null;
let width = null;
// 괄호를 추가!
let area = (height ?? 100) * (width ?? 50);
alert(area); // 5000
</script>
<script>
let area = height ?? (100 * width) ?? 50;
</script>
<script>
let x = 1 && 2 ?? 3; // SyntaxError: Unexpected token '??'
</script>
<script>
let x = (1 && 2) ?? 3; // 제대로 동작합니다.
alert(x); // 2
</script>