본문 바로가기
Javascript study

[Javascript] nullish 병합 연산자 '??'

by 카누가 좋아요 2023. 7. 12.

📌 참고 사이트

nullish 병합 연산자 '??' (javascript.info)

 

nullish 병합 연산자 '??'

 

ko.javascript.info

 

 

 

📋 nullish 병합 연산자

nullish 병합 연산자(nullish coalescing operator)를 사용하면 짧은 문법으로 여러 피연산자 중 그 값이 확정되어 있는(null이나 undefined가 아닌) 변수를 찾을 수 있다.

📍 a ?? b 의 평가 결과

➡️ a가 null도 아니고 undefined도 아니면 a이다.

➡️ 위 경우 이외에는 b이다.

 

 

📍 ?? 연산자 없이 x = a ?? b와 동일한 동작을 하는 코드 작성하기

 

x = (a !== null && a !== undefined) ? a : b;

 

위에서 나온 설명대로 a가 null도 아니면서 동시에 undefined가 아닐 때에만 결과로 a가 반환되고, 그 이외의 경우에는 b가 반환된다.

nullish 병합 연산자는 위 코드를 더 짧게 만들 수 있다는 장점이 있다.

 

 

📍 nullish 병합 연산자 사용 예시

➡️ firstName, lastName, nickName이라는 변수에 사용자 이름이나 별명을 저장하는데, 사용자가 아무런 정보도 입력하지 않는 케이스(null의 케이스)도 허용한다고 해보자.

화면에는 세 변수 중 실제 값이 입력된 변수의 값을 출력하는데, 세 변수 모두 값이 없다면 '익명의 사용자'가 출력되도록 하자.

 

위와 같은 경우 nullish 병합 연산자를 사용하면 값이 정해진 변수를 간단하게 찾아낼 수 있다.

 

let fristName = null;     // 정보 입력 X
let lastName = null;     // 정보 입력 X
let nickName = '바이올렛'     // 이름 입력

// ??를 사용하면 null이나 undefined가 아닌 첫 번째 피연산자가 반환된다.
alert(firstName ?? lastName ?? nickName ?? "익명의 사용자");     // 익명의 사용자

 

위 코드에서 ??를 이전 시간에 배운 논리 연산자 &&나 ||와 같은 작성 방식으로 사용하였다.

위와 같이 여러 값들을 피연산자로 하고 ??를 사용하면 왼쪽에서부터 시작하여 null이나 undefined가 아닌 첫 번째 피연산자가 반환된다.

 

➡️ 또한 ?? 는 변수에 기본값을 할당하는 용도로 사용할 수 있다.

 

// height가 null이나 undefined인 경우 100을 할당
height = height ?? 100;

 

 

 

📋 ?? 와 || 의 차이

📍 ?? 와 || 의 차이

위의 예시를 다시 살펴보자.

??는 null이나 undefined가 아닐 때 그 피연산자를 반환한다고 하였다.

||에서 null과 undefined는 false이고, OR 연산에서는 가장 먼저 true가 되는 값을 반환한다고 하였으므로 ?? 연산자를 사용했을 때와 마찬가지로 null과 undefined가 아닌 첫 번째 값으로 '바이올렛'이 반환된다.

 

기능이 같다고 생각할 수 있지만 두 연산자에는 차이가 있다.

➡️ ||첫 번째 truthy한 값을 반환한다.

➡️ ??첫 번째 정의된(defined) 값을 반환한다.

 

 

📍 ?? 와 || 의 차이를 볼 수 있는 예시

 

let height = 0;

alert(height || 100);     // 1. 100
alert(height ?? 100);     // 2. 0

 

1️⃣

height || 100 은 곧 0 || 100이다. 0을 불린형으로 변환하면 false가 된다. 따라서 다음 피연산자를 평가하게 되고, 100은 불린형에서 true이므로 100이 반환되게 된다. 즉, 100이 첫 번째로 참인 값이다.

 

2️⃣

height ?? 100 은 곧 0 ?? 100이다. 0은 정의된 값이다. 즉, undefined이거나 null이 아니다. 따라서 0이 첫 번째로 발견되는 정의된 값이 되고 0이 반환되고 끝나게 된다.

 

위와 같은 특징 때문에 0이 할당될 가능성이 있는 변수를 사용해 기능을 개발할 때는 ||보다는 ??가 적합하다.

 

 

 

📋 ??의 연산자 우선순위

➡️ ??의 연산자 우선순위5로 꽤 낮다.

* 연산자 우선순위 표 (순위 숫자가 클수록 우선순위가 높다.)

 

순위 연산자 이름 기호
..... ..... .....
17 단항 덧셈, 단항 부정 +, -
16 지수 **
15 곱셈, 나눗셈 *, /
13 뺄셈, 덧셈 -, +
..... ..... .....
3 할당 =
..... ..... .....

 

➡️ ??는 =와 ?보다는 먼저, 대부분의 연산자보다는 나중에 평가된다.

➡️ 따라서 ??를 사용하는 식에서는 괄호를 추가하는 것이 좋다.

 

<예시>

 

let height = null;
let width = null;

// 괄호를 추가!
// (null ?? 100)에서 100, (null ?? 50)에서 50 반환, area에는 100과 50을 곱한 5000이 값으로 들어감.
let area = (height ?? 100) * (width ?? 50);

alert(area);     // 5000

 

➡️ 안정성 관련 이슈 때문에 ??&&나 ||와 함께 사용하지 못한다. 

위와 같은 제약을 피하여면 괄호를 사용해야 한다.

 

// 잘못된 경우
let x = 1 && 2 ?? 3     // SyntaxError : Unexpected token '??'

// 제대로 동작하는 경우 (괄호 사용)
let x = (1 && 2) ?? 3    
alert(x);     // 2

 

 

두 번째 예시로 주어진 제대로 동작하는 경우를 살펴보자.

가장 먼저 괄호 안에 있는 1 && 2가 실행된다. AND 연산자를 사용한 경우 가장 먼저 false가 되는 값을 반환하는데, 위의 경우 둘 다 true이므로 마지막 피연산자인 2가 반환된다.

그리고 2 ?? 3이 실행된다. ??는 가장 먼저 발견되는 undefined나 null이 아닌 값을 반환하므로 2가 반환되고 결국 2가 x에 할당되게 된다.

'Javascript study' 카테고리의 다른 글

[Javascript] switch문  (0) 2023.07.14
[Javascript] while과 for 반복문  (0) 2023.07.14
[Javascript] 논리 연산자  (0) 2023.07.10
[Javascript] if와 '?'를 사용한 조건 처리  (0) 2023.07.09
[Javascript] 비교 연산자  (0) 2023.07.08

댓글