[Javascript] ๋„ ๋ณ‘ํ•ฉ์—ฐ์‚ฐ์ž '??'์™€ ์˜ต์…”๋„ ์ฒด์ด๋‹ '?.'
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ '?'

ES2020์—์„œ ๋„์ž…๋œ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•๋“ค ์ค‘ ์˜ต์…”๋„ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž ?. ์™€ null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž ?? ๋Š” ๋ชจ๋‘ ๋ฌผ์Œํ‘œ๋ฅผ ์“ด๋‹ค.

์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹๋„ null์ด๋‚˜ undefined ๊ฐ’์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋น„์Šทํ•œ ๊ฒƒ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„, ์ด ๋‘˜์„ ํ•œ๋ฒˆ ๋ฌถ์–ด์„œ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ข‹๊ฒ ๋‹ค ์‹ถ์–ด์„œ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๐Ÿ™‚

 

 

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

์šฐ์„  null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž(nullish coalescing) ??์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ undefined์ด๋‚˜ null์ด ์•„๋‹Œ ๊ฐ’์ด ํ• ๋‹น๋œ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.

 

a ?? b

์ด ์—ฐ์‚ฐ์ž๋Š” ์œ„์™€ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • a๊ฐ€ null ๋„ ์•„๋‹ˆ๊ณ  undefined๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด a
  • ๊ทธ ์™ธ(null์ด๋‚˜ undefined)์—๋Š” b

 

๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋กœ ํ’€์–ด์จ๋ณด๋ฉด ์ด๋ ‡๋‹ค.

let a = (a !== null && a !== undefined) ? a : b 

null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฌด์ง€ํ•˜๊ฒŒ ์งง์•„์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด ์—ฐ์‚ฐ์ž๋Š” ํŠนํžˆ๋‚˜ ๋ณ€์ˆ˜์— ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๊ฐ€ ๋„์ž…๋˜๊ธฐ ์ „์—๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž OR์„ ๋œปํ•˜๋Š” || ์„ ๋งŽ์ด ์ด์šฉํ–ˆ์—ˆ๊ณ , ์‹ค์ œ๋กœ ์œ„ ์˜ˆ์‹œ๋ฅผ || ์—ฐ์‚ฐ์ž๋กœ ๋ฐ”๊พธ์–ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค.

const test = null ?? 'default';
const test2 = null || 'default';

 

์ฐจ์ด๋ฅผ ๋“ค์ž๋ฉด || ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ ์™ผ์ชฝ์ด Falsyํ•œ ๊ฐ’์ผ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ ,

?? ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ ์™ผ์ชฝ์ด null์ด๋‚˜ undefined๋กœ ์ •์˜๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

null๊ณผ undefined, ์ˆซ์ž 0์„ ๊ตฌ๋ถ„ ์ง€์–ด ๋‹ค๋ค„์•ผ ํ•  ๋•Œ, 0์€ Falsyํ•œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ||๋ณด๋‹ค๋Š” ?? ๊ฐ€ ๋”์šฑ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํ•˜๋‹ค.

 

 

์˜ต์…”๋„ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž

์˜ต์…”๋„ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž๋Š” ์ค‘์ฒฉ ๊ฐ์ฒด์—์„œ ํ”„๋กœํผํ‹ฐ๊ฐ€ null์ด๋‚˜ undefined๊ฐ€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐ๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

a?.b

์™ผ์ชฝ ์—ฐ์‚ฐ์ž๊ฐ€ null์ด๊ฑฐ๋‚˜ undefined์ธ ๊ฒฝ์šฐ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ ํ”„๋กœํผํ‹ฐ์˜ ์ฐธ์กฐ๋ฅผ ์ด์–ด๊ฐ„๋‹ค.

const elem = null;
const value = elem?.value;

 

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ณ€์ˆ˜ value๋Š” ๋ณ€์ˆ˜ elem์ด null์ด๊ฑฐ๋‚˜ undefined์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค.

๋ณด๋‹ค์‹œํ”ผ elem์€ null์ด ํ• ๋‹น๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

const elem = {  
value: 'hello',  
};  
const value = elem?.value;

์ด์ œ elem์ด ๊ฐ์ฒด๋กœ ์„ ์–ธ๋˜์—ˆ๊ณ  value๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž์™€ ๋น„์Šทํ•˜๊ฒŒ ์ด์ „์—๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž &&์„ ์ด์šฉํ•ด์„œ ๋ณ€์ˆ˜๊ฐ€ null์ด๊ฑฐ๋‚˜ undefined์ธ ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋‹ค. ์—ญ์‹œ Falsy ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋”ฐ์กŒ๊ธฐ ๋•Œ๋ฌธ์— Falsy ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” 0์ด๋‚˜ ''๋ฅผ ๊ฑฐ๋ฅผ ์ˆ˜ ์—†์—ˆ๋‹ค๋Š” ์ ..

const elem = null;
const value = elem && elem.value;

 

 

ํ•˜์ง€๋งŒ ์˜ต์…”๋„ ์ฒด์ธ์ง€ ์—ฐ์‚ฐ์ž๋Š” Falsyํ•œ ๊ฐ’์ด๋ผ๋„ null์ด๊ฑฐ๋‚˜ undefinedํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

 

 

 

 

์ฐธ๊ณ 

์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ https://ko.javascript.info/nullish-coalescing-operator

 

MDN https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive 9์žฅ 9.4.2, 9.4.3

 

 

 

728x90