- ๋ถ๋ณ๊ฐ์ฒด์ ๋ํด ์ดํดํ๋ค.
- ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ๊ฐ ๋ฌด์์ด๊ณ ์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง ์ดํดํ๋ค.
- undefined์ null์ด ๋ฌด์์ด๊ณ ์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง ์ดํดํ๋ค.
-
๋ถ๋ณ๊ฐ์ฒด๋?
๋ถ๋ณ๊ฐ์ฒด๋ ์ต๊ทผ React, Vue, Angular ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์์๋ฟ๋ง ์๋๋ผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ, ๋์์ธ ํจํด ๋ฑ์์๋ ๋งค์ฐ ์ค์ํ ๊ธฐ์ด๊ฐ ๋๋ ๊ฐ๋ ์ ๋๋ค. ์์ ๋ง์๋๋ฆฐ ์ฐธ์กฐํ ๋ฐ์ดํฐ์ ๊ฐ๋ณ์ ๋ฐ์ดํฐ ์์ฒด๊ฐ ์๋ ๋ฐ์ดํฐ ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ๋๋ง ์ฑ๋ฆฝํฉ๋๋ค. ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ฉด(์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ๊ณ ์ ํ๋ฉด) ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ์กด ๋ฐ์ดํฐ๋ ๋ณํ์ง ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๋๋ง๋ค ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌํ ๋นํ๊ธฐ๋ก ๊ท์น์ ์ ํ๊ฑฐ๋, ์๋์ผ๋ก ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋๊ตฌ(immutable.js, immer,js, immutability-helper ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ES6์ spread operator, Object.assign ๋ฑ)๋ฅผ ํ์ฉํ๋ค๋ฉด ๋ถ๋ณ์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค. ํน์ ๋ถ๋ณ์ฑ์ ํ๋ณดํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ถ๋ณ๊ฐ์ฒด๋ก ์ทจ๊ธํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด ๋ฐฉ์๋๋ก ์ฌ์ฉํ๋ ์์ผ๋ก ์ํฉ์ ๋ฐ๋ผ ๋์ฒํ ์ ์์ต๋๋ค. ๋ถ๋ณ๊ฐ์ฒด๊ฐ ํ์ํ ์ํฉ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ ๋จผ์ , ์์ ์ธ๊ธํ spread operator์ Object.assign ๋ฉ์๋๋ฅผ ์ดํด๋ณด๊ธฐ๋ก ํ๊ฒ ์ต๋๋ค.
const arr1 = [1, 2, 3];
๋จผ์ arr1์ ์์ ๊ฐ์ด ์ ์ธํฉ๋๋ค.
const arr1 = [1, 2, 3]; const arr2 = arr1; arr2[0] = 4; console.log(arr1); // [4, 2, 3]; console.log(arr2); // [4, 2, 3];
์ด์ ํํธ์์ ํ์ตํ๋ฏ์ด arr2์ arr1์ ์์ ๊ฐ์ด ํ ๋นํ๋ฉด ๋ณต์ฌ๊ฐ ์๋ ์ฐธ์กฐ๊ฐ ์ผ์ด๋ฉ๋๋ค. ํ์ง๋ง ์ ๊ฐ ๊ตฌ๋ฌธ์ ์ด์ฉํด ์๋์ ๊ฐ์ด ํ ๋นํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
const arr1 = [1, 2, 3]; const arr2 = [...arr1]; arr2[0] = 4; console.log(arr1); // [1, 2, 3]; console.log(arr2); // [4, 2, 3];
์ฐธ์กฐ๊ฐ ์๋๋ผ ๋ณต์ฌ๋์์ต๋๋ค. ์ด๋ ๋ฏ ๊ฐ์ผ๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๊ฐํ๋๋ผ๋ ์๋ณธ ๊ฐ์ฒด๋ ๋ณํ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ์ ๋ถ๋ณ๊ฐ์ฒด๊ฐ ํ์ํฉ๋๋ค. Object.assign๋ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const target = {}; const source = { a: 1, b: 2 }; Object.assign(target, source); // taget์ source๋ฅผ ํ ๋น! console.log(target); // { a: 1, b: 2 } console.log(source); // { a: 1, b: 2 } target['c'] = 3; console.log(target); // { a: 1, b: 2, c: 3 } console.log(source); // { a: 1, b: 2 }
์ญ์ ์ฐธ์กฐ๊ฐ ์๋๋ผ ๋ณต์ฌ๋์์ต๋๋ค. Object.assign์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
const target = { a: 1, b: 2 }; const source = { b: 3, c: 4 }; Object.assign(target, source); // taget์ source๋ฅผ ํ ๋น! console.log(target); // { a: 1, b: 3, c: 4 } console.log(source); // { b: 3, c: 4 }
-
๋ถ๋ณ๊ฐ์ฒด๊ฐ ํ์ํ ์ํฉ
์ฝ๋๋ฅผ ๋จผ์ ์ดํด๋ณธ ๋ค์ ์ค๋ช ๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
const user = { name: 'soulcactus', gender: 'female', }; const changeName = (user, newName) => { const newUser = user; newUser['name'] = newName; return newUser; }; const user2 = changeName(user, 'hwizzzang'); // ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ง ์๊ณ ์์ต๋๋ค! ๐ if (user !== user2) { console.log('์ ์ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.'); } console.log(user['name'], user2['name']); // hwizzzang hwizzzang console.log(user === user2); // true
newUser์ user๋ฅผ ํ ๋นํ๋ ์๊ฐ ์ฐ๋ฆฌ๋ ์ฐธ์กฐ๊ฐ ์ผ์ด๋๋ค๋ ์ฌ์ค์ ์ด์ ์๊ณ ์์ต๋๋ค.
๊ธฐ์ต์ด ๋์ง ์์ผ์ ๋ค๋ฉดpart01์ ์ฐธ๊ณ ํด ์ฃผ์ธ์. ์กฐ๊ฑด๋ฌธ์ ์ดํด๋ณด์๋ฉด "์ ์ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ ค์ฃผ์!"๋ ์ด ๋ก์ง์ ๋ชฉํ๊ฐ ๋ช ํํ๊ฒ ๋ณด์ ๋๋ค.์ํ๊น์ง๋ง ํ์ฌ ์ฝ๋๋ก๋ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ง ์์ต๋๋ค(...)์์ ๊ฐ์ด ์ ๋ณด๊ฐ ๋ฐ๋ ์์ ์ ์๋ฆผ์ ๋ณด๋ด์ผ ํ๋ค๊ฑฐ๋, ๋ฐ๋๊ธฐ ์ ์ ์ ๋ณด์ ๋ฐ๋๊ธฐ ์ ์ ์ ๋ณด ์ฐจ์ด๋ฅผ ๊ฐ์์ ์ผ๋ก ๋ณด์ฌ์ค์ผ ํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค๋ฉด ์ด๋๋ก๋ ์๋๋ฏ๋ก ๋ณ๊ฒฝ ์ ๊ณผ ํ์ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.const user = { name: 'soulcactus', gender: 'female', }; const changeName = (user, newName) => { return { name: newName, gender: user['gender'], }; }; const user2 = changeName(user, 'hwizzzang'); if (user !== user2) { console.log('์ ์ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.'); // ์ด์ ์๋ํฉ๋๋ค! ๐ } console.log(user['name'], user2['name']); // soulcactus hwizzzang console.log(user === user2); // false
changeName ํจ์๊ฐ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ก ์์ ํ์ต๋๋ค. ์ด์ user์ user2๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ๋ก ์์ ํ๊ฒ ๋ณ๊ฒฝ ์ ๊ณผ ํ๋ฅผ ๋น๊ตํ ์ ์์ต๋๋ค. ๋ค๋ง ์์ง ๋ฏธํกํ ์ ์ด ๋ณด์ด๋๋ฐ์, changeName ํจ์๊ฐ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ ๊ธฐ์กฑ ๊ฐ์ฒด์ ํ๋กํผํฐ(์ด ๊ฒฝ์ฐ์๋ gender)๋ฅผ ํ๋์ฝ๋ฉ์ผ๋ก ์ ๋ ฅํ ์ ์ ๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก๋ ๋์ ๊ฐ์ฒด์ ์ ๋ณด๊ฐ ๋ง์ ์๋ก, ๋ณ๊ฒฝํด์ผ ํ ์ ๋ณด๊ฐ ๋ง์ ์๋ก ์๊ณ ๊ฐ ๋์ด๋ฉ๋๋ค. ์ด๋ฐ ๋ฐฉ์๋ณด๋ค๋ ๋์ ๊ฐ์ฒด์ ํ๋กํผํฐ ์์ ์๊ด ์์ด ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํ๋ ํจ์๋ฅผ ๋ง๋๋ ํธ์ด ๋ ์ข์ต๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const copyObject = (target) => { const result = {}; for (const prop in target) { result[prop] = target[prop]; } return result; };
copyObject ํจ์๋ for in ๋ฌธ๋ฒ์ ์ด์ฉํด result ๊ฐ์ฒด์ target ๊ฐ์ฒด ํ๋กํผํฐ๋ค์ ๋ณต์ฌํ๋ ํจ์์ ๋๋ค. ํ๋กํ ํ์ ์ฒด์ด๋ ์์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํ๋ ์ , getter, setter๋ ๋ณต์ฌํ์ง ์๋ ์ , ์์ ๋ณต์ฌ(๋ท ๋ถ๋ถ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค)๋ง ์ํํ๋ค๋ ์ ์์ ์ฝ๊ฐ์ ์์ฌ์์ด ์์ผ๋ ๊ทธ ์์ฌ์์ ๋ณด์ํ๊ธฐ ์ํด ํจ์๋ฅผ ๋ฌด๊ฒ๊ฒ ๋ง๋๋ ๊ฒ๋ณด๋ค ์ผ๋จ ์ด ์์ ์ ๊ฐ์ฒด์ ๋ํด์๋ ๋ฌธ์ ๋์ง ์์ผ๋ฏ๋ก ์งํํด๋ณด๋๋ก ํฉ๋๋ค.
const user = { name: 'soulcactus', gender: 'female', }; const user2 = copyObject(user); user2['name'] = 'hwizzzang'; if (user !== user2) { console.log('์ ์ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.'); // ์ด์ ์๋ํฉ๋๋ค! ๐ } console.log(user['name'], user2['name']); // soulcactus hwizzzang console.log(user === user2); // false
copyObject ํจ์๋ฅผ ์ด์ฉํด ๊ฐ๋จํ๊ฒ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๊ณ ๋ด์ฉ์ ์์ ํ๋ ๋ฐ ์ฑ๊ณตํ์ต๋๋ค. ์ด์ ๋ถํฐ ํ์ ํ๋ ๋ชจ๋ ๊ฐ๋ฐ์๋ค์ด user ๊ฐ์ฒด ๋ด๋ถ ๋ณ๊ฒฝ์ด ํ์ํ ๋ ๋ฌด์กฐ๊ฑด copyObject ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํฉ์ํ๊ณ ๊ทธ ๊ท์น์ ์งํจ๋ค๋ ์ ์ ํ์์๋ user ๊ฐ์ฒด๊ฐ ๊ณง ๋ถ๋ณ๊ฐ์ฒด๋ผ๊ณ ํ ์ ์๊ฒ ์ต๋๋ค. ๊ทธ๋ ์ง๋ง ๋ชจ๋๊ฐ ๊ทธ ๊ท์น์ ์งํค๋ฆฌ๋ผ๋ ์ ๋ขฐ์๋ง ์์งํ๋ ๊ฒ์ ์๊ณ ๊นจ์ง๊ธฐ ์ฌ์ด ์ด์ผ์ํ์ ๊ฑท๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ณด๋ค๋ ๋ชจ๋๊ฐ ๊ทธ ๊ท์น์ ๋ฐ๋ฅด์ง ์๊ณ ๋ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ๋ ์์คํ ์ ์ผ๋ก ์ ์ฝ์ ๊ฑฐ๋ ํธ์ด ์์ ํฉ๋๋ค. ์ด ๊ฐ์ ๋งฅ๋ฝ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ฅ ๊ฐ์ฒด๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์ ๋ถ๋ณ์ฑ์ ์ง๋ ๋ณ๋์ ๋ฐ์ดํฐ ํ์ ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ immutable.js, baobab.js ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฑ์ฅํด ์ธ๊ธฐ๋ฅผ ๋๊ณ ์์ต๋๋ค.
์์ ๋ณต์ฌ๋ ๋ฐ๋ก ์๋ ๋จ๊ณ์ ๊ฐ๋ง ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ด๊ณ , ๊น์ ๋ณต์ฌ๋ ๋ด๋ถ์ ๋ชจ๋ ๊ฐ๋ค์ ํ๋ํ๋ ์ฐพ์์ ์ ๋ถ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์์ copyObject ํจ์๋ ์์ ๋ณต์ฌ๋ง ์ํํ์ต๋๋ค. ์ด ๋ง์ ์ค์ฒฉ๋ ๊ฐ์ฒด์์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํ ๋ ๊ทธ ์ฃผ์๊ฐ๋ง ๋ณต์ฌํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ํด๋น ํ๋กํผํฐ์ ๋ํด ์๋ณธ๊ณผ ์ฌ๋ณธ์ด ๋ชจ๋ ๋์ผํ ์ฐธ์กฐํ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. ์ฌ๋ณธ์ ๋ฐ๊พธ๋ฉด ์๋ณธ๋ ๋ฐ๋๊ณ , ์๋ณธ์ ๋ฐ๊พธ๋ฉด ์ฌ๋ณธ๋ ๋ฐ๋๋๋ค.
const user = {
name: 'soulcactus',
urls: {
portfolio: 'https://github.com/soulcactus',
blog: 'https://soulcactus.netlify.com',
twitter: 'https://twitter.com/_soulcactus',
},
};
const user2 = copyObject(user);
user2['name'] = 'hwizzzang';
console.log(user['name'] === user2['name']); // false
user['urls']['portfolio'] = 'https://github.com/hwizzzang';
console.log(user['urls']['portfolio'] === user2['urls']['portfolio']); // true
user2['urls']['blog'] = '';
console.log(user['urls']['blog'] === user2['urls']['blog']); // true์์ ๋ณต์ฌ๊ฐ ์ผ์ด๋ฌ๊ธฐ ๋๋ฌธ์ user2์ urls๊ฐ user์ urls๋ฅผ ๊ทธ๋๋ก ์ฐธ์กฐํ๊ณ ์์ต๋๋ค. ์ด๋ฐ ํ์์ด ๋ฐ์ํ์ง ์๊ฒ ํ๋ ค๋ฉด user.urls ํ๋กํผํฐ์ ๋ํด์๋ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const user2 = copyObject(user);
user2['urls'] = copyObject(user['urls']);
user['urls']['portfolio'] = 'https://github.com/hwizzzang';
console.log(user['urls']['portfolio'] === user2['urls']['portfolio']); // false
user2['urls']['blog'] = '';
console.log(user['urls']['blog'] === user2['urls']['blog']); // falseuser์ urls ํ๋กํผํฐ๋ copyObject๋ฅผ ํตํด ๋ณต์ฌํด user2์ urls์ ํ ๋นํ์ต๋๋ค. ์ด์ user2์ urls๋ user์ urls๋ฅผ ์ฐธ์กฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋๊น ์ด๋ค ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ๊ฐ์ฒด ๋ด๋ถ์ ๋ชจ๋ ๊ฐ์ ๋ณต์ฌํด์ ์์ ํ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ณ ์ ํ ๋, ๊ฐ์ฒด์ ํ๋กํผํฐ ์ค์์ ๊ทธ ๊ฐ์ด ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ผ ๊ฒฝ์ฐ์๋ ๊ทธ๋๋ก ๋ณต์ฌํ๋ฉด ๋์ง๋ง ์ฐธ์กฐํ ๋ฐ์ดํฐ์ผ ๊ฒฝ์ฐ์๋ ๋ค์ ๊ทธ ๋ด๋ถ์ ํ๋กํผํฐ๋ค์ ๋ณต์ฌํด์ผ ํฉ๋๋ค. ์ด ๊ณผ์ ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ง๋ค ์ฌ๊ท์ ์ผ๋ก ์ํํด์ผ๋ง ๋น๋ก์ ๊น์ ๋ณต์ฌ๊ฐ ๋๋ ๊ฒ์ ๋๋ค. ์ด ๊ฐ๋ ์ ๋ฐํ์ผ๋ก copyObject ํจ์๋ฅผ ๊น์ ๋ณต์ฌ ๋ฐฉ์์ผ๋ก ์์ ํด ๋ณด๊ฒ ์ต๋๋ค.
const copyObjectDeep = (target) => {
let result = {};
if (typeof target === 'object' && target !== null) {
for (const prop in target) {
result[prop] = copyObjectDeep(target[prop]);
}
} else {
result = target;
}
return result;
};target !== null ์กฐ๊ฑด์ ๋ถ์ธ ์ด์ ๋ typeof ๋ช ๋ น์ด๊ฐ null์ ๋ํด์๋ object๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ฒด ๋ฒ๊ทธ์ ๋๋ค. ์๋ ์ฝ๋๋ฅผ ํตํด ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
const obj = {
a: 1,
b: {
c: null,
d: [1, 2],
},
};
const obj2 = copyObjectDeep(obj);
obj2['a'] = 3;
obj2['b']['c'] = 4;
obj2['b']['d'][1] = 3;
console.log(obj); // { a: 1, b: { c: null, d: [1, 2] } }
console.log(obj2); // { a: 3, b: { c: 4, d: {0: 1, 1: 3}} }์ถ๊ฐ๋ก hasOwnProperty ๋ฉ์๋๋ฅผ ํ์ฉํด ํ๋กํ ํ์ ์ฒด์ด๋์ ํตํด ์์๋ ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํ์ง ์๊ฒ๋ ํ ์๋ ์์ต๋๋ค.
const obj = {
a: 1,
b: {
c: null,
d: [1, 2],
},
};
console.log(obj.hasOwnProperty('b')); // true
console.log(obj.hasOwnProperty('c')); // falseES5์ getter์ setter๋ฅผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ์ํ๊น๊ฒ๋ ES6์ Object.getOwnPropertyDescriptor ๋๋ ES2017์ Object.getOwnPropertyDescriptor ์ธ์๋ ๋ง๋ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋์ผ๋ก ๊ฐ๋จํ๊ฒ ๊น์ ๋ณต์ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ ํ๋๋ฅผ ๋ ์๊ฐํ๊ฒ ์ต๋๋ค. ์๋ฆฌ๋ ๋จ์ํ๋ฐ์, ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ๋ฒ์ผ๋ก ํํ๋ ๋ฌธ์์ด๋ก ๋ณํํ๋ค๊ฐ ๋ค์ JSON ๊ฐ์ฒด๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋จ์ํจ์๋ ๋ถ๊ตฌํ๊ณ ์ ๋์ํฉ๋๋ค. ๋ค๋ง, ๋ฉ์๋(ํจ์)๋ ์จ๊ฒจ์ง ํ๋กํผํฐ์ธ proto๋ getter, setter ๋ฑ๊ณผ ๊ฐ์ด JSON์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ ํ๋กํผํฐ๋ค์ ๋ชจ๋ ๋ฌด์ํฉ๋๋ค. httpRequest๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ๋ฑ ์์ํ ์ ๋ณด๋ง ๋ค๋ฃฐ ๋ ํ์ฉํ๊ธฐ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
const copyObjectViaJSON = (target) => {
return JSON.parse(JSON.stringify(target));
};
const obj = {
a: 1,
b: {
c: null,
d: [1, 2],
func1: function() {
console.log(3);
},
func2: function() {
console.log(4);
},
},
};
const obj2 = copyObjectViaJSON(obj);
obj2['a'] = 3;
obj2['b']['c'] = 4;
obj['b']['d'][1] = 3;
console.log(obj); // { a: 1, b: { c: null, d: [1, 3], func1: f(), func2: f() }}
console.log(obj2); // { a: 3, b: { c: 4, d: [1, 2] } }์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์์์ ๋ํ๋ด๋ ๊ฐ์ด ๋ ๊ฐ์ง๊ฐ ์๋๋ฐ์, ๋ฐ๋ก undefined์ null์ ๋๋ค. ๋ ๊ฐ์ ์๋ค๋ ์๋ฏธ๋ ๊ฐ์ ๋ฏํ๋ ๋ฏธ์ธํ๊ฒ ๋ค๋ฅด๊ณ ์ฌ์ฉํ๋ ๋ชฉ์ ๋ํ ๋ค๋ฆ ๋๋ค.
-
undefined
undefined๋ ์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ํ ์ ์์ผ๋ ๊ฐ์ด ์กด์ฌํ์ง ์์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์๋์ผ๋ก ๋ถ์ฌํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฌ์ฉ์๊ฐ ์๋น ์ด๋ค ๊ฐ์ ์ง์ ํ ๊ฒ์ด๋ผ๊ณ ์์๋๋ ์ํฉ์์๋ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ์ง ์์์ ๋ undefined๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ์ธ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์ด์ ํด๋นํฉ๋๋ค.
- ๊ฐ์ ๋์ ํ์ง ์์ ๋ณ์, ์ฆ ๋ฐ์ดํฐ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ํ์ง ์์ ์๋ณ์์ ์ ๊ทผํ ๋
- ๊ฐ์ฒด ๋ด๋ถ์ ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋
- return๋ฌธ์ด ์๊ฑฐ๋ ํธ์ถ๋์ง ์๋ ํจ์์ ์คํ ๊ฒฐ๊ณผ
let a; console.log(a); // undefined const obj = { a: 1 }; console.log(obj['a']); // 1 console.log(obj['b']); // undefined console.log(b); // Uncaught ReferenceError: b is not defined const func = () => {}; // return ๊ฐ์ด ์์ผ๋ฉด undefined๋ฅผ ๋ฐํํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ const c = func(); console.log(c); // undefined
undefined๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ์ ๋ ํผ๋ฐ์ค ์๋ฌ๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ ค๋ฉด, not defined๋ ์ ์๋ ์ ์ด ์์์ ์๋ฏธํ๊ณ undefined๋ ์์ง ์ ์๋์ง ์์์์ผ๋ก ์ดํดํ๋ ๊ฒ์ด ์ฝ์ต๋๋ค. ๋ณ์ a๋ ์ด๋ฏธ ์ ์ธ๋์ผ๋ ์์ง ๊ฐ์ ๊ฐ์ง์ง ์์ ๊ฒฝ์ฐ์ด๋ฏ๋ก undefined๋ฅผ ๋ฐํํฉ๋๋ค. obj['b'] ์ญ์ ์์ง ์ ์๋์ง ์์์ผ๋ฏ๋ก undefined๋ฅผ ๋ฐํํฉ๋๋ค. ๋ณ์ b๋ ์ ์๋ ์ ์ด ์์ผ๋ฏ๋ก ๋ ํผ๋ฐ์ค ์๋ฌ๊ฐ ์ผ์ด๋ฉ๋๋ค. ์ฐธ๊ณ ๋ก ๋ณ์ a๋ฅผ ์ ์ธํ๊ณ ์๋ฌด๋ฐ ๊ฐ๋ ํ ๋นํ์ง ์์์ ๋, ๋ค๋ฅธ ๋์์์๋ "let a๋ผ๋ ๊ตฌ๋ฌธ์ ์ํด ์๋ณ์ a์ ์๋์ผ๋ก undefined๊ฐ ํ ๋น๋๊ณ , ๊ทธ ๊ฐ์ด ํ ๋น๋์ง ์์ ์๋ณ์์ ์ ๊ทผํ ๋" ์๋์ผ๋ก ํ ๋น๋ undefined๋ฅผ ๋ฐํํ๋ค๊ณ ํ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋์ํ์ง ์์ต๋๋ค. ์ ํํ๋ ์๋ฌด๊ฒ๋ ํ ๋นํ์ง ์๊ณ ๋๋๋ฉฐ, ์ดํ ๋ณ์ a์ ์ ๊ทผํ๊ณ ์ ํ ๋ ๋น๋ก์ undefined๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
๊ฐ์ ๋์ ํ์ง ์์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ์กฐ๊ธ ํน์ดํ ๋์์ ํ๋๋ฐ์, ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const arr1 = []; console.log(arr1); // [] arr1.length = 3; console.log(arr1); // [empty x 3]; const arr2 = new Array(3); console.log(arr2); // [empty x 3]; const arr3 = [undefined, undefined, undefined]; console.log(arr3); // [undefined, undefined, undefined]
๋น ๋ฐฐ์ด์ ์ ์ธํ ํ ๊ธธ์ด๋ฅผ ์ง์ ํ๋ฉด undefined ์กฐ์ฐจ ๋ค์ด ์์ง ์์ ์ธ ๊ฐ์ ๋น ์์๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. ๋ฐ๋ฉด, ์ธ ๊ฐ์ undefined๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ ํ ๋นํ๋ฉด ์ธ ๊ฐ์ undefined๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ด ๋ฐํ๋ฉ๋๋ค. ์ด์ฒ๋ผ ๋น์ด ์๋ ์์์ undefined๋ฅผ ํ ๋นํ ์์๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ฉฐ, ๋น ์์๋ ๋ฐฐ์ด ๋ฉ์๋์ ์ํ ๋์์์ ์ ์ธ๋ฉ๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const arr1 = [undefined, 1]; const arr2 = []; arr2[1] = 1; arr1.forEach((v, i) => console.log(v, i)); // undefined 0 / 1 1 arr2.forEach((v, i) => console.log(v, i)); // 1 1 arr1.map((v, i) => v + i); // [NaN, 2] arr2.map((v, i) => v + i); // [empty, 2] arr1.filter((v) => !v); // [undefined] arr2.filter((v) => !v); // [] arr1.reduce((p, c, i) => { return p + c + i; }, ''); // undefined011 arr2.reduce((p, c, i) => { return p + c + i; }, ''); // 11
์ง์ undefined๋ฅผ ํ ๋นํ arr1์ ๋ํด์๋ ์ผ๋ฐ์ ์ผ๋ก ์๊ณ ์๋ ๋๋ก ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ํํด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ arr2์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๊ฐ ๋ฉ์๋๋ค์ด ๋น์ด ์๋ ์์์ ๋ํด์๋ ์ด๋ ํ ์ฒ๋ฆฌ๋ ํ์ง ์๊ณ ๊ฑด๋๋ฐ์์์ ์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋์์ด ๋ฐฐ์ด์์๋ง ๋ฐ๊ฒฌํ ์ ์๋ ํน๋ณํ ํ์์ธ ๊ฒ์ฒ๋ผ ์๊ฐํ์ง๋ง, ์ฌ์ค ๋ฐฐ์ด๋ ๊ฐ์ฒด์์ ์๊ฐํด ๋ณด๋ฉด ์ง๊ทนํ ์์ฐ์ค๋ฌ์ด ํ์์ ๋๋ค. ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ์ ๋ํด์๋ ์ํํ ์ ์๋ ๊ฒ์ด ๋น์ฐํฉ๋๋ค. ๋ฐฐ์ด์ ๋ฌด์กฐ๊ฑด length ํ๋กํผํฐ์ ๊ฐ์๋งํผ ๋น ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๊ฐ ๊ณต๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ด๋ฆ์ผ๋ก ์ง์ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฝ์ง๋ง, ์ค์ ๋ก๋ ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ ์ง์ ํ ๋ ๋น๋ก์ ๋น ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ด๋ฆ์ผ๋ก ์ง์ ํ๊ณ ๋ฐ์ดํฐ์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ๋ฑ์ ๋์์ ํฉ๋๋ค. ์ฆ, ๊ฐ์ด ์ง์ ๋์ง ์์ ์ธ๋ฑ์ค๋ ์์ง ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ์ ์ง๋์ง ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ๋ถ์ฌํ ๊ฒฝ์ฐ์ ๋น์ด์๋ ์์์ ์ ๊ทผํ๋ ค ํ ๋ ๋ฐํ๋๋ ๋ ๊ฒฝ์ฐ์ 'undefined'์ ์๋ฏธ๋ฅผ ๊ตฌ๋ถํ ์ ์๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ํ ๊ฒฝ์ฐ, undefined๋ ๊ทธ ์์ฒด๋ก ๊ฐ์ ๋๋ค. ๋น๋ก ๋น์ด์์์ ์๋ฏธํ๊ธด ํ์ง๋ง ํ๋์ ๊ฐ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์ด๋์ ํ๋กํผํฐ๋ ๋ฐฐ์ด์ ์์๋ ๊ณ ์ ์ ํค๊ฐ(ํ๋กํผํฐ ์ด๋ฆ)์ด ์ค์กดํ๊ฒ ๋๊ณ ๋ฐ๋ผ์ ์ํ์ ๋์์ ๋๋ค. ํํธ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ๋ ์ ์์ด ๋ฐํํ๋ undefined์ ๊ฒฝ์ฐ ํด๋น ํ๋กํผํฐ ๋ด์ง ๋ฐฐ์ด์ ํค๊ฐ ์์ฒด๊ฐ ์กด์ฌํ์ง ์์์ ์๋ฏธํฉ๋๋ค. ์ข ํฉํด ๋งํ๋ฉด ๊ฐ์ผ๋ก์จ ํ ๋น๋ undefined๋ ์ค์กด ๋ฐ์ดํฐ์ธ ๋ฐ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋ฐํํ๋ undefined๋ ๋ง ๊ทธ๋๋ ๊ฐ์ด ์์์ ๋ํ๋ ๋๋ค.
-
null
์ฌ์ค, ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง null์ด ๋ณ๋๋ก ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด undefined๋ฅผ ์จ์ผํ ์ด์ ๊ฐ ์์ต๋๋ค. ๋น์ด์์์ ๋ช ์์ ์ผ๋ก ๋ํ๋ด๊ณ ์ถ์ ๋๋ null์ ์ฐ๋ฉด ๋ฉ๋๋ค. null์ ์ ์ด๋ถํฐ ์ด๋ฌํ ์ฉ๋๋ก ๋ง๋ค์ด์ง ๋ฐ์ดํฐ ํ์ ์ด๋ฉฐ, ์ด ๊ท์น์ ๋ฐ๋ฅด๋ฉด undefined๋ ์ค์ง "๊ฐ์ ๋์ ํ์ง ์์ ๋ณ์์ ์ ๊ทผํ๊ณ ์ ํ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋ฐํํด ์ฃผ๋ ๊ฐ"์ผ๋ก์๋ง ์กด์ฌํ ์ ์์ต๋๋ค. ํ์ง๋ง null์ ํ๊ฐ์ง ์ฃผ์ํ ์ ์ด ์์ต๋๋ค. ์์ ๋ง์๋๋ ธ๋ฏ, typeof null์ด object๋ผ๋ ์ ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ค ๋ณ์์ ๊ฐ์ด null์ธ์ง ์ฌ๋ถ๋ฅผ ํ๋ณํ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํฉ๋๋ค. ์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const n = null; console.log(typeof n); // object console.log(n == undefined); // true console.log(n == null); // true console.log(n === undefined); // false console.log(n === null); // true
ํ์ ์ ๋น๊ตํ์ง ์๋ ๋๋ฑ ์ฐ์ฐ์๋ก ๋น๊ตํ ๊ฒฝ์ฐ null๊ณผ undefined๊ฐ ์๋ก ๊ฐ๋ค๊ณ ํ๋จํ์ง๋ง ํ์ ์ ๋น๊ตํ๋ ์ผ์น ์ฐ์ฐ์๋ก ๋น๊ตํ ๊ฒฝ์ฐ ๋ค๋ฅด๋ค๊ณ ํ๋จํฉ๋๋ค.
๋ฐ์ดํฐ ํ์ ํํธ๊ฐ ๋๋ฌ์ต๋๋ค. ๋ณ์์ ์๋ณ์, ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ปดํจํฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ์ผ์ด๋๋ ์ผ, ๊ธฐ๋ณธํ๊ณผ ์ฐธ์กฐํ์ด ๋ฌด์์ด๊ณ ์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง, ๊ฐ๋ณ๊ฐ๊ณผ ๋ถ๋ณ๊ฐ์ด ๋ฌด์์ด๊ณ ์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง, ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ์์ ๋ณต์ฌ, ๊น์ ๋ณต์ฌ, undefined์ null๊น์ง ์์๋ดค์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ์์ญ์ธ ๋งํผ ํ์คํ๊ฒ ์ง๊ณ ๋์ด๊ฐ๋ฉด, ์ค๊ธ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ๊ธฐ ์ํ ์ด์์ด ๋ ๊ฒ์ ๋๋ค. ๐