\(@^0^@)/
[JS] ์ต์ ๋ ์ฒด์ด๋ ?. ๋ณธ๋ฌธ
๐ฑ๐ ์ต์ ๋ ์ฒด์ด๋์ ๋ฐฐ์ฐ๊ธฐ ์ , ์์์ผ ํ falsey ๊ฐ
โจ ์ต์
๋ ์ฒด์ด๋ (Optional Chaining)
ํ๋กํผํฐ๊ฐ ์๋ ์ค์ฒฉ ๊ฐ์ฒด๋ฅผ ์๋ฌ ์์ด ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋ค.
์ต์
๋ ์ฒด์ด๋์ ์ต์
๋ ๋ด๋ถ์ ๋ด๋ถ์ ๋ด๋ถ๋ก ์ต์
๋์ด ์ฐ๊ฒฐ๋์ด ์์ ๋ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์๋ค.
๐ค ์ต์ ๋ ์ฒด์ด๋์ ์ฐ์ง ์์์ ๋ฐ์ํ ๋ฌธ์ ์ ์์๋ค ( ์ต์ ๋ ์ฒด์ด๋์ด ํ์ํ ์ด์ )
1. ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ช
์๋๋ฐ, ๊ทธ์ค ๋ช ๋ช
์ ์ด๋ฉ์ผ ์ ๋ณด๊ฐ ์์.
=> ๊ทธ๋ด ๊ฒฝ์ฐ, ์ด๋ฉ์ผ์ ๋ฑ๋กํ์ง ์์ ์ ์ ์ ์ด๋ฉ์ผ ์ ๋ณด์ ์ ๊ทผํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์
2. JS๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง์ ์กด์ฌํ์ง ์๋ ์์์ ์ ๊ทผํด, ์์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ค ํ ๋
(์ต์
๋ ์ฒด์ด๋์ด ๋์ค๊ธฐ ์ ์๋ && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ฝ๋๊ฐ ์์ฃผ ๊ธธ์ด์ง๋ค๋ ๋จ์ ์ด ์์)
let nestedProp = ((obj.first === null || obj.first === undefined) ? undefined : obj.first.second);
๐ง ์ต์
๋ ์ฒด์ด๋์ ์ฌ์ฉ๋ฒ
?. ์์ ์๋ ๋์์ด (truthy)์ธ ๊ฐ์ด๋ฉด ๋ค ์ฝ๋๋ฅผ ์คํํ๊ณ ,
๊ฑฐ์ง(falsy)์ธ ๊ฐ์ด๋ฉด ํ๊ฐ๋ฅผ ๋ฉ์ถ๊ณ , ์ฝ๋๋ฅผ ๋ชจ๋ undefined๋ก ๋ง๋ค์ด ๋ฒ๋ฆฐ๋ค.
let user = {}; // ์ด๋ฉ์ผ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์
alert( user?.email?.address ); // undefined, ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์.
// user?.email ๋ก ์ด๋ฉ์ผ์ ์ฝ์ผ๋ฉด ์๋์ ๊ฐ์ด user ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๋๋ผ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์.
let user = null;
console.log( user?.email ); // undefined
console.log( user?.email.address ) // undefined
// user ๊ฐ null ์ด๋ undefined ๊ฐ ์๋๊ณ ,
// ์ค์ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ๋ฐ๋์ user.email ํ๋กํผํฐ๋ ์์ด์ผ ํจ.
// ๊ทธ๋ ์ง ์์ผ๋ฉด, user?.email.address ์ ๋ ๋ฒ์งธ ์ (.address) ์ฐ์ฐ์์์ ์๋ฌ๊ฐ ๋ฐ์ํจ.
// dogName ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๋๋ผ๋, ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์.
const user = {
name: 'amy',
cat: {
name: 'nemo'
}
};
const dogName = adventurer.dog?.name;
console.log(dogName);
// expected output: undefined
console.log(user.someNonExistentMethod?.());
// expected output: undefined
์ต์ ๋ ์ฒด์ด๋์ ์์ ์๋ ๋์์๋ง ๋์๋๋ค.
๐ง ์ต์ ๋ ์ฒด์ด๋ ์ฌ์ฉ์ ์ฃผ์์
1. ์กด์ฌํ์ง ์์๋ ๊ด์ฐฎ์ ๋์์๋ง ์ฌ์ฉํด์ผ ํจ.
์ฌ์ฉ์ ์ด๋ฉ์ผ์ ๋ค๋ฃจ๋ ์์ ์์์๋ ๋ฐ๋์ user๊ฐ ์์ด์ผ ํ์ง๋ง, email์ ํ์ ๊ฐ์ด ์๋.
๊ทธ๋ฌ๋ฏ๋ก user.email?.address ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
์ค์๋ก user ์ ๊ฐ์ ํ ๋นํ์ง ์์๋ค๋ฉด, ์ดํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์๋ ์์ผ๋ ์ ์คํด์ผ ํจ!
2. ์์ ๋ณ์๋ ๊ผญ ์ ์ธ๋์ด ์์ด์ผ ํจ.
๋ณ์ user ๊ฐ ์ ์ธ๋์ด ์์ง ์์ผ๋ฉด user?.anything ํ๊ฐ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
// ReferenceError: user is not defined
user?.email;
์ต์
๋ ์ฒด์ด๋์ ์ ์ธ์ด ์๋ฃ๋ ๋ณ์๋ฅผ ๋์์ผ๋ก๋ง ๋์ํ๊ธฐ ๋๋ฌธ์,
user?.anything์ ์ฌ์ฉํ๋ ค๋ฉด let์ด๋ const๋ฅผ ์ฌ์ฉํด์ user๋ฅผ ์ ์ํด์ผ ํจ.
3. ๋จ๋ฝ ํ๊ฐ : ์ผ์ชฝ ํ๊ฐ๋์์ ๊ฐ์ด ์์ผ๋ฉด ์ฆ์ ํ๊ฐ๋ฅผ ๋ฉ์ถค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํจ์ ํธ์ถ์ ๋น๋กฏํ ์ต์
๋ ์ฒด์ด๋์ ์ค๋ฅธ์ชฝ์ ์๋ ๋ถ๊ฐ ๋์๋ค์ ์ต์
๋ ์ฒด์ด๋์ ํ๊ฐ๊ฐ ๋ฉ์ท์ ๋ ๋๋ ์ผ์ด๋์ง ์์.
let user = null;
let num = 0;
user?.hi(num++); // ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์.
alert(num); // ๊ฒฐ๊ณผ๊ฐ์ 0, num์ ์ฆ๊ฐํ์ง ์์ต๋๋ค.
๐ง ?.( ) ์ ?.[ ] ์ฌ์ฉ๋ฒ
์ต์
๋ ์ฒด์ด๋์ ์ฐ์ฐ์๊ฐ ์๋๋ผ, ํจ์๋ ๋๊ดํธ์ ํจ๊ป ๋์ํ๋ ํน๋ณํ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ฒด์ด๋ค.
1. ?.( )
๋ ์ํฉ ๋ชจ๋์์ user ๊ฐ์ฒด๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ email ํ๋กํผํฐ๋ . ๋ง ์ฌ์ฉํด์ ์ ๊ทผ ํ,
?.( ) ๋ฅผ ์ฌ์ฉํ์ฌ email์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํจ.
// ํ ๊ฐ์ฒด์๋ ๋ฉ์๋ email์ด ์์ง๋ง, ๋ค๋ฅธ ๊ฐ์ฒด์๋ ์๋ ์ํฉ
// ?.() ์ ์ฌ์ฉํ ์์
let user1 = {
email() {
alert("user1์ email");
}
}
let user2 = {};
user1.admin?.(); // user1์ email
user2.admin?.();
user1 ์๋ email ์ด ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๊ฐ ์ ๋๋ก ํธ์ถ๋ ๋ฐ๋ฉด,
user2 ์๋ email ์ด ์ ์๋์ด ์์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์๋ฌ ์์ด ๊ทธ๋ฅ ํ๊ฐ๊ฐ ๋ฉ์ถค.
2. ?.[ ]
. ๋์ ๋๊ดํธ [ ] ์ ์ฌ์ฉํด ๊ฐ์ฒด ํ๋กํผํฐ์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์๋ ?.[ ] ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ?.[ ] ๋ฅผ ์ฌ์ฉํด๋ ์์ ์ฝ๋์ฒ๋ผ ๊ฐ์ฒด ์กด์ฌ ์ฌ๋ถ๊ฐ ํ์คํ์ง ์์ ๊ฒฝ์ฐ์ ์์ ํ๊ฒ ํ๋กํผํฐ๋ฅผ ์ฝ์ ์ ์์.
// ํ ๊ฐ์ฒด์๋ ๋ฉ์๋ email์ด ์์ง๋ง, ๋ค๋ฅธ ๊ฐ์ฒด์๋ ์๋ ์ํฉ
// ?.[] ์ ์ฌ์ฉํ ์์
let user1 = {
email: "google.com"
};
let user2 = null; // user2๋ ๊ถํ์ด ์๋ ์ฌ์ฉ์๋ผ๊ณ ๊ฐ์ .
let key = "email";
alert( user1?.[key] ); // email
alert( user2?.[key] ); // undefined
alert( user1?.[key]?.something?.not?.existing); // undefined
3. ?. ์ delete์ ์กฐํฉํด ์ฌ์ฉํ ์ ์์.
delete user?.email; // user๊ฐ ์กด์ฌํ๋ฉด user.email์ ์ญ์
4. ?. ์ ์ฝ๊ธฐ๋ ์ญ์ ๋ ํ ์ ์์ง๋ง, ์ฐ๊ธฐ์๋ ์ฌ์ฉํ ์ ์์. ( ?. ์ ํ ๋น ์ฐ์ฐ์ ์ผ์ชฝ์์ ์ฌ์ฉํ ์ ์์ )
// user๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ user.email ๊ฐ์ ์ฐ๋ ค๊ณ ์๋ ํ ๊ฒฝ์ฐ
user?.email = "google.com"; // SyntaxError: Invalid left-hand side in assignment
// ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ undefined = "google.com"์ด ๋๊ธฐ ๋๋ฌธ.
โก ์์ฝ
์ต์ ๋ ์ฒด์ด๋ ๋ฌธ๋ฒ ?. ์ ์ธ ๊ฐ์ง ํํ๋ก ์ฌ์ฉํ ์ ์๋ค.
- obj?.prop – obj๊ฐ ์กด์ฌํ๋ฉด obj.prop์ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด undefined๋ฅผ ๋ฐํํจ
- obj?.[prop] – obj๊ฐ ์กด์ฌํ๋ฉด obj[prop]์ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด undefined๋ฅผ ๋ฐํํจ
- obj?.method() – obj๊ฐ ์กด์ฌํ๋ฉด obj.method()๋ฅผ ํธ์ถํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด undefined๋ฅผ ๋ฐํํจ
?. ์ผ์ชฝ ํ๊ฐ ๋์์ด null์ด๋ undefined์ธ์ง ํ์ธํ๊ณ null์ด๋ undefined๊ฐ ์๋๋ผ๋ฉด ํ๊ฐ๋ฅผ ๊ณ์ ์งํ
?.๋ฅผ ๊ณ์ ์ฐ๊ฒฐํด์ ์ฒด์ธ์ ๋ง๋ค๋ฉด ์ค์ฒฉ ํ๋กํผํฐ๋ค์ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์์.
?.์ ์ผ์ชฝ ํ๊ฐ๋์์ด ์์ด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ์๋ง ์ ํ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํจ.
๊ผญ ์์ด์ผ ํ๋ ๊ฐ์ธ๋ฐ ์๋ ๊ฒฝ์ฐ์ ?.์ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋ฐ ์๋ฌ๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์์ผ๋ฏ๋ก ์ฃผ์!
โป ์ฐธ๊ณ : ZeroCho Tv - ES2021 ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ข
โป ์ฐธ๊ณ : https://ko.javascript.info/optional-chaining
โป ์ฐ์ฐ ํด์ฆ ์ฐธ๊ณ : https://velog.io/@yejinh/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-null-%EB%B3%91%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90%EC%99%80-%EC%98%B5%EC%85%94%EB%84%90-%EC%B2%B4%EC%9D%B4%EB%8B%9D
โป falsey ๊ฐ MDN : https://developer.mozilla.org/ko/docs/Glossary/Falsy
โป ์ต์ ๋ ์ฒด์ด๋ MDN : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
jQuery ์ฉ๊ธฐ์ด (0) | 2021.09.08 |
---|---|
[JS] DocumentFragment (0) | 2021.09.04 |
[JS] ๊น์ ๋ณต์ฌ์ ์์ ๋ณต์ฌ (0) | 2021.09.01 |
[JS] ์๊ฐ, ๋ ์ง๋ฅผ ํํ ํ๋ - new Date() (0) | 2021.08.31 |
[JS] ์ค์ผ์ฅด๋งํ๋ setTimeout() & setInterval() (0) | 2021.08.30 |