์ต์ ๋ ์ฒด์ด๋์ด๋?. javascript optional chaining ?.
๐ ์ต์ ๋ ์ฒด์ด๋์ด๋?
โ ์ต์ ๋ ์ฒด์ด๋?.
์ต์ ๋ ์ฒด์ด๋(optional chaining) ?. ์ ์ฌ์ฉํ๋ฉด
ํ๋กํผํฐ๊ฐ ์๋ ์ค์ฒฉ ๊ฐ์ฒด๋ฅผ ์๋ฌ ์์ด ์์ ํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
ex) user.getAddress?.()
โ ์ต์ ๋ ์ฒด์ด๋์ด ํ์ํ ์ด์
์๋ ์ ๋ณด
์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ช ์๊ณ , ๊ทธ์ค ๋ช ๋ช ์ ์ฃผ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด๋ด ๋ user.address.street๋ฅผ ์ฌ์ฉํด ์ฃผ์ ์ ๋ณด์ ์ ๊ทผํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค.
let user = {} //์ฃผ์ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์
console.log(user.address.street) //TypeError: Cannot read property 'street' of undefined
์์ง ๊ทธ๋ ค์ง์ง ์์ DOM
๋ ๋ค๋ฅธ ์ํฉ์ผ๋ก๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด์
ํ์ด์ง์ ์กด์ฌํ์ง ์๋ ์์์ ์ ๊ทผํด ์์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ค ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
//querySelector(...) ํธ์ถ ๊ฒฐ๊ณผ๊ฐ null์ธ ๊ฒฝ์ฐ ์๋ฌ ๋ฐ์
let html = document.querySelector('.element').innerHTML;
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๋ฐ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์๋ค.
let user = {} //์ฃผ์ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์
console.log( user && user.address && user.address.street )
//undefined, ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค
์ด๋ ๊ฒ AND๋ฅผ ์ฐ๊ฒฐํด์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ์์ฃผ ๊ธธ์ด์ง๋ค๋ ๋จ์ ์ด ์๋ค.
โ ์ต์ ๋ ์ฒด์ด๋์ ๋ฑ์ฅ ' ?. '
?.์ ?.'์’์ ํ๊ฐ ๋์์ด undefined๋ null์ด๋ฉด ํ๊ฐ๋ฅผ ๋ฉ์ถ๊ณ undefined๋ฅผ ๋ฐํํ๋ค.
๋งจ ์ฒ์ ์์ ์ฝ๋์ ๋น๊ตํด๋ณด์.
// ?. ๋ฏธ์ฌ์ฉ
let user = {} //์ฃผ์ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์
console.log(user.address.street) //TypeError: Cannot read property 'street' of undefined
// ?.์ฌ์ฉ
let user = {} //์ฃผ์ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์
console.log( user?.address?.street ); //undefined, ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค
์ต์ ๋ ์ฒด์ด๋ ํต์ฌ
- ?.์ ?. ‘์’ ํ๊ฐ ๋์์๋ง ๋์๋๊ณ , ํ์ฅ ๋์ง๋ ์๋๋ค
- ?.์์ ๋ณ์๋ ๊ผญ ์ ์ธ๋์ด ์์ด์ผ ํ๋ค.
๋ณ์ user๊ฐ ์ ์ธ๋์ด์์ง ์์ผ๋ฉด user?.anything ํ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. - ๋ฌธ๋ฒ : obj?.prop
obj?.[expr]
obj?.()
arr?.[index]
func?.(args)
user?.address //ReferenceError: user is not defined
์ต์ ๋ ์ฒด์ด๋ ์ฃผ์์
- ์ต์ ๋ ์ฒด์ด๋์ ๋จ์ฉํ์ง ๋ง์.
- ?.๋ ์กด์ฌํ์ง ์์๋ ๊ด์ฐฎ์ ๋์์๋ง ์ฌ์ฉํด์ผ ํ๋ค.โญ
์ฌ์ฉ์ ์ฃผ์๋ฅผ ๋ค๋ฃจ๋ ์์ ์์์์
๋ ผ๋ฆฌ์ user๋ ๋ฐ๋์ ์์ด์ผ ํ๊ณ , address๋ ํ์๊ฐ์ด ์๋๋ค.
๊ทธ๋ฌ๋ user.address?.street๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ ์ฌ์ฉ๋ฒ์ด๋ค.
์๋๋ฉด ์ด๋ ํ ์ค์๋ก ์ธํด ๊ผญ ํ์ํ ์ ๋ณด์ธ user์ ๊ฐ์ ํ ๋นํ์ง ์์๋ค๋ฉด
์ด ์ฌ์ค์ ๋ฐ๋ก ์์๋ผ ์ ์๋๋ก ํด์ผ ํ๋ค.
์ด๋ฌํ ์๋ฌ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ค๋ฉด ๋ฌธ์ ํ์ ๊ณผ ๋๋ฒ๊น ์ด ์ด๋ ค์์ง๋ค.
๋จ๋ฝ ํ๊ฐ
๋ ผ๋ฆฌ ์ฐ์ฐ ์ ์ฒซ ๋ฒ์งธ ๊ฐ๋ง์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ํ์คํ ๋ ๋ ๋ฒ์งธ ๊ฐ์ ํ๊ฐํ์ง ์๋ ๋ฐฉ๋ฒ
?.๋ ์ผ์ชฝ ํ๊ฐ ๋์์ ๊ฐ์ด ์์ผ๋ฉด ์ฆ์ ํ๊ฐ๋ฅผ ์ค๋จํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ?. ์ค๋ฅธ์ชฝ ๋ถ๊ฐ ๋์์ ?.์ ํ๊ฐ๊ฐ ๋ฉ์ท์ ๋ ์ค๋จ๋๋ค.
let user = null;
let x = 0;
user?.hello(x++); // hello()๋ ์ค๋จ๋๋ค
console.log(x); // 0, x๋ ์ฆ๊ฐํ์ง ์๋๋ค
?.์ ์ฌ์ฉ ๊ธฐ๋ฅ
์ฌ์ฉ ๊ฐ๋ฅ : ์ฝ๊ธฐ, ์ญ์
์ฌ์ฉ ๋ถ๊ฐ : ์ฐ๊ธฐ
// ์ญ์
delete user?.name //user๊ฐ ์กด์ฌํ๋ฉด user.name์ ์ญ์
// ์ฐ๊ธฐ
user?.name = "opntional" //SyntaxError: Invalid left-hand side in assignment
//undefined = "opntional" ๋๊ธฐ ๋๋ฌธ์ ์๋ฌ ๋ฐ์
๐ก ์ต์ ๋ ์ฒด์ด๋ ์ ๋ฆฌ
- ?.์ ?.์ผ์ชฝ ํ๊ฐ๋์์ด ์์ด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ์๋ง ์ ํ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค.
- ?.(optional chaining)์์ ์ค๋ ๋ณ์๋ ์ ์ธ์ด ๋์ด ์์ด์ผ ํ๋ค.
- ๊ผญ ์์ด์ผ ํ๋ ๊ฐ์ธ๋ฐ ์๋ ๊ฒฝ์ฐ์ ?.์ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋ฐ ์๋ฌ๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์์ผ๋ฏ๋ก
์ด๋ฐ ์ํฉ์ ๋ง๋ค์ง ์๋๋ก ํ์!
console.log(user?.address?.street) // user ๊ฐ์ฒด๊ฐ ๊ผญ ์์ด์ผ ํ ํ์๊ฐ ์๋ค๋ ๋ป
console.log(user.address?.street); // user ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ์๋ฌ ๋ฐ์
์ฐธ๊ณ
https://ko.javascript.info/optional-chaining
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining