3항 연산자를 잘못 쓴 거라고 믿고 싶은 모양의 코드를 보았습니다.
매우 당혹스럽네요.
?.
과 ??
는 뭘까요?
?.
는 객체(배열)의 중첩된 프로퍼티가 undefined
또는 null
일 때 에러 없이 접근 가능.obj?.prop
, obj?.[expr]
, arr?.[index]
, func?.(args)
const user = {};
console.log(user.address.street); // TypeError: Cannot read properties of undefined (reading 'street')
console.log(user?.address?.street); // undefined
undefined
또는 null
이면 평가를 멈추고 undefined
반환.const user = {};
// user만 평가 대상이 되며, user은 undefined나 null이 아니므로, ?.를 사용 안한것과 같은 결과를 가짐.
console.log(user?.address.street); // TypeError: Cannot read properties of undefined (reading 'street')
// 이미 address에서 평가가 undefined로 나옴. (평가대상이 address)
console.log(user.address?.street); // undefined
// 따라서 그 이후값은 계속 undefined가 나옴. (평가대상이 address)
console.log(user.address?.street.type); // undefined
const arr = [
[1, 8, 2],
[3, 4, 5],
];
// arr 값은 평가대상이 아니고 무조건 존재해야 하기 때문에 부적합.
console.log(arr?.[5][1]); // TypeError: Cannot read properties of undefined (reading '1')
// 평가대상은 arr이의 index값이 5인 요소의 존재 유무.
console.log(arr[5]?.[1]); // undefined
??
는 왼쪽 평가대상(표현식)이 null
또는 undefined
일 때 오른쪽 표현식를 반환, 그렇지 않으면 왼쪽 평가대상을 반환하는 논리 연산자. leftExpr ?? rightExpr
let x = NaN;
console.log(x || 'hi'); // hi
// null 병합 연사자는 null과 undefined 값을 제외하고 모든 값을 truthy하게 판단.
console.log(x ?? 'hi'); // NaN
let x = null;
console.log(x || 'hi'); // hi
console.log(x ?? 'hi'); // hi