nullish 병합 연산자 (??)
- null과 undefined 값만을 체크해 비어있지 않은 값을 찾는 연산자입니다.
- ||와의 차이점
- ||: falsy(0, '', false 포함)를 건너뜀
- ??: null과 undefined만 건너뜀 (숫자 0이나 false는 값으로 인정)
- 연산자 우선순위
- ??는 우선순위가 낮아 괄호를 사용해 명확하게 표현하는 것이 좋습니다.
nullish 병합 연산자의 평가 방식
let a = null;
let b = undefined;
let c = "값 있음";
let result = a ?? b ?? c ?? "기본값";
console.log(result); // "값 있음"
- a와 b는 nullish이므로 건너뜀.
- c는 값이 존재하므로 반환됨.
- ??는 null과 undefined만 체크합니다.
??와 ||의 차이점
??와 ||는 유사하게 동작하지만, 중요한 차이점이 있습니다.
연산자 체크 기준 예시 결과
` | ` | falsy 체크 (값이 false로 평가되면 넘어감) | |
?? | nullish 체크 (null, undefined만 넘어감) | 0 ?? 100 | 0 |
예제
let height = 0;
alert(height || 100);
// ||는 falsy 체크를 하므로 0은 falsy로 간주, 결과: 100
alert(height ?? 100);
// ??는 nullish 체크를 하므로 0은 값으로 인정, 결과: 0
- ||는 값이 0, false, '' 등 falsy로 평가될 경우 기본값을 반환.
- ??는 값이 null 또는 undefined일 때만 기본값을 반환.
3항 연산자와의 비교
??를 사용하지 않고 3항 연산자로 동일한 로직을 구현하려면 코드가 길어집니다.
let x = (a !== null && a !== undefined) ? a : b;
단점
- 코드가 길고 가독성이 떨어짐.
- 여러 변수를 체크하면 더 복잡해짐.
- ??를 사용한 경우
- let x = a ?? b;
연산자 우선순위와 괄호 사용
??의 우선순위는 낮기 때문에 다른 연산자와 함께 사용 시 괄호를 명확히 사용해야 합니다.
문제 코드
let area = height ?? 100 * width ?? 50;
// 순서: height ?? (100 * width) ?? 50
올바른 코드
let area = (height ?? 100) * (width ?? 50);
??와 &&, ||를 함께 사용할 때
??는 &&나 ||와 직접 혼합해서 사용할 수 없습니다.
let x = 1 && 2 ?? 3; // SyntaxError 발생!
괄호를 사용해 해결
let x = (1 && 2) ?? 3; // 결과: 2
안전한 사용법
- 기본 값 제공 시 ?? 사용 (nullish 값만 체크)
- 다른 연산자와 함께 사용할 땐 괄호를 사용해 명확하게 표현
예제
let userHeight = null;
let defaultHeight = 100;
let height = userHeight ?? defaultHeight; // 100
let validHeight = (userHeight ?? 100) * 2; // 200
nullish 병합 연산자(??)의 실무 활용
??는 안전한 코드 작성에 매우 유용합니다. 특히, 예상치 못한 nullish 값(null, undefined)으로 인해 발생할 수 있는 오류를 방지하는 데 도움을 줍니다.
- 기본값 제공
let userInput = null; let defaultInput = "기본 값"; let finalInput = userInput ?? defaultInput; console.log(finalInput); // 결과: "기본 값"
- userInput이 nullish(null, undefined)이므로 defaultInput이 반환됩니다.
- 이를 통해 코드의 예측 가능성이 향상됩니다.
- 변수가 nullish 상태일 때 기본값을 할당함으로써, 프로그램이 예상치 못한 동작을 하지 않도록 보호합니다.
- 불필요한 조건문 제거
// 기존 조건문 사용 let result; if (a !== null && a !== undefined) { result = a; } else { result = b; } // nullish 병합 연산자를 사용한 경우 let result = a ?? b;
- ??를 사용하면 코드가 간단하고 명확해져 실수를 줄일 수 있습니다.
- nullish 상태를 체크하기 위해 조건문을 사용하는 대신, ??를 사용하여 간결하고 안전한 코드를 작성할 수 있습니다.
- 의도하지 않은 falsy 값 방지이로 인해 의도치 않은 값의 무시를 방지할 수 있습니다.
- ||를 사용할 경우, 0이 무시되는 문제가 발생합니다.
- ??는 null, undefined만 체크하므로 안전합니다.
- let pageCount = 0; console.log(pageCount || 10); // 결과: 10 (0이 무시됨) console.log(pageCount ?? 10); // 결과: 0 (0은 nullish가 아니므로 사용됨)
- ??는 0, false, ''와 같은 falsy 값을 nullish 값과 구분합니다.
- API 호출 및 데이터 처리 시
let apiResponse = { user: { name: null, age: 25 } }; let userName = apiResponse.user.name ?? "Unknown User"; console.log(userName); // 결과: "Unknown User"
- 외부 데이터가 nullish일 경우에도 코드가 정상적으로 동작합니다.
- 이를 통해 안정성과 가독성을 동시에 확보할 수 있습니다.
- 외부 데이터나 API 호출 시 값이 없을 가능성을 대비해 기본값을 제공하여 오류를 방지합니다.
예시
잘못된 연산을 방지
let value = null;
// 잘못된 연산
console.log(value.length); // TypeError: Cannot read property 'length' of null
// nullish 병합으로 방지
let safeValue = value ?? "";
console.log(safeValue.length); // 결과: 0
DOM 요소를 안전하게 처리
let element = document.querySelector(".non-existent-element");
// nullish 병합으로 안전한 처리
let elementText = element?.textContent ?? "기본 텍스트";
console.log(elementText); // 결과: "기본 텍스트"
nullish 병합 연산자와 디폴트 매개변수 비교
함수의 매개변수에서 기본값을 제공하는 방법과 유사하지만, 더 유연한 활용이 가능합니다.
function printMessage(message = "기본 메시지") {
console.log(message);
}
let msg = null;
printMessage(msg); // 결과: "기본 메시지"
let anotherMsg = null ?? "기본 메시지";
console.log(anotherMsg); // 결과: "기본 메시지"
'바닐라 코드 > Java Script' 카테고리의 다른 글
15. switch문 (0) | 2024.12.23 |
---|---|
14. while, for 반복문 (0) | 2024.12.19 |
12. 논리연산자 (0) | 2024.12.17 |
11. if와 '?' (0) | 2024.12.16 |
10. 비교연산자 (2) | 2024.12.13 |