๐Ÿ“† 22.11.08 - Nullish coalescing operator

๋ฒ„๋“คยท2022๋…„ 11์›” 7์ผ
0

โœจToday I Learn (TIL)

๋ชฉ๋ก ๋ณด๊ธฐ
15/58
post-thumbnail

ํ•œ๋ˆˆ์— ๋ณด๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ•ธ๋“œ๋ถ ์„ ์ตœ๋Œ€ํ•œ ๋“ค๊ณ ๋‹ค๋‹ˆ๋ฉด์„œ ์šฉ์ดํ•˜๊ฒŒ ํƒ€์ž…์„ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค. (์˜ค๋Š˜๋„ ํ—ฌ์Šค์žฅ์—์„œ ํ•˜์ฒดํ•˜๋ฉด์„œ ๋ดค์–ด์š”~)

๊ทธ๋Ÿฐ๋ฐ Nullish ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ผ๋Š” ํŒŒํŠธ์—์„œ Nullish๋ผ๋Š” ์šฉ์–ด๋Š” ์ฒ˜์Œ ๋“ค์–ด๋ณด๋Š” ๊ฒƒ ๊ฐ™๋‹ค..
์ด๊ฒƒ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์›๋ž˜ ์‚ฌ์šฉํ•˜๋˜ ๊ฐœ๋…์ธ๋ฐ, ๋ชจ๋ฅด๊ณ  ์ง€๋‚˜์ณ์˜จ ๋‚ด ์ž์‹ ์„ ๋ฐ˜์„ฑํ•˜๋ฉด์„œ ๋ฐ”๋กœ MDN์„ ์ผœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

Nullish ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž

์ œ๋ชฉ์ฒ˜๋Ÿผ ์œ ์‹ํ•ด ๋ณด์ด๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž ๋Œ€์‹  coalescing operator๋ฅผ ์จ๋ณด๋„๋ก ํ•˜์ž..! ์—ฌํŠผ
HEROPY ๋‹˜์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ Nullish ๋ถ€๋ถ„์„ ๋ณด๋ฉด ์ด๋Ÿฐ ๋ง์”€์„ ํ•˜์…จ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž ||๋ฅผ ์‚ฌ์šฉํ•ด Falsy ์ฒดํฌ(0, "", NaN, null, undefined๋ฅผ ํ™•์ธ)ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ 0์ด๋‚˜ "" ๊ฐ’์„ ์œ ํšจ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์›์น˜ ์•Š๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Ÿด ๋•Œ ์œ ์šฉํ•œ Nullish ๋ณ‘ํ•ฉ(Nullish Coalescing) ์—ฐ์‚ฐ์ž ??๋ฅผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž or์„ ํ†ตํ•˜์—ฌ Boolean ๊ฐ’์„ ์ฒดํฌ ํ•  ๋•Œ, ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋น„์—ˆ๊ฑฐ๋‚˜, 0์ธ ๊ฒฝ์šฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›์น˜ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•˜๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ๋ง‰๋Š”๋‹ค๋Š” ๋Š๋‚Œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

Mdn ์—์„œ Nullish coalescing operator์— ๋Œ€ํ•˜์—ฌ ์ž์„ธํžˆ ์ •๋ฆฌ๋˜์–ด์žˆ์œผ๋‹ˆ ์ด๊ฒƒ์„ ๋ณด๋ฉด ์ดํ•ด์— ๋„์›€์ด ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.

Nullish coalescing operator ๋Š” ์•ฝ๊ฐ„ ์‚ผํ•ญ์—ฐ์‚ฐ์ž ๋Š๋‚Œ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. ์•„๋‹ˆ ๋˜‘๊ฐ™์„์ง€๋„?
์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ null or undefined ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž return ์•„๋‹ˆ๋ฉด ์™ผ์ชฝ์€ return ํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž์ด๋‹ค.

null, undefined ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ falsy ๊ฐ’์— ํ•ด๋‹นํ•  ๊ฒฝ์šฐ์—๋„ ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž OR (||) ๋Œ€์กฐ๋œ๋‹ค๊ณ  ํ•˜๋‹ˆ, ๋ฐ˜๋Œ€๋˜๋Š” ํŠน์„ฑ์ธ ๋“ฏ ์‹ถ๋‹ค.

๋Œ€์ฒด์ ์ธ ํ˜•์‹์€ ์ด๋Ÿฌํ•˜๋‹ค.

const x = leftExpr ?? rightExpr

๊ทธ๋ฆฌ๊ณ  &&, || ์—ฐ์‚ฐ์ž์™€ ์ง์ ์ ‘์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด Syntax error ์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค๊ณ  ํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์น™์—ฐ์‚ฐ์„ ํ•  ๋•Œ, ์šฐ์„ ์ˆœ์œ„ ์—ฐ์‚ฐ์ž์— () ๊ฐ์‹ธ์„œ ์“ฐ๋“ฏ, ์ด ๋˜ํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ช…์‹œํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

(null || undefined ) ?? "foo"; // returns "foo"

Optional chaining ๊ณผ์˜ ๊ด€๊ณ„

Null coalescing operator ๋ช…ํ™•ํ•œ ๊ฐ’์œผ๋กœ null, undefined๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ , optional chaining (?.) ์€ null ํ˜น์€ undefined์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์— ์ ‘๊ทผํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค.

์•„๋ž˜๋Š” MDN ์˜ ์˜ˆ์‹œ์ด๋‹ค.

function getMiscObj(){
  return {
    aNullProperty: null,
    emptyText: "", // this is not falsy
    someNumber: 42
  };
};

const miscObj = getMiscObj();

const newObj = {};
newObj.propA = miscObj.aNullProperty ?? "default for A";
newObj.propB = miscObj.emptyText ?? "default for B";
newObj.propC = miscObj.someNumber ?? 0;

console.log(newObj.propA); // "default for A"
console.log(newObj.propB); // "" (as the empty string is not null or undefined)
console.log(newObj.propC); // 42
profile
ํƒœ์–ด๋‚œ ๊น€์— ๋งŽ์€ ๊ฒฝํ—˜์„ ํ•˜๋ ค๊ณ  ์•„๋“ฑ๋ฐ”๋“ฑ ์• ์“ฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€