Objects โ
๐งฉ Related
๐ก ๋์ ์์ฑ (Dynamic Property)
์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ๋์ค์ ์์ฑ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
์ฆ, ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์ด๋ค ํค๋ฅผ ์ธ์ง ๋ฏธ๋ฆฌ ์ ์ ์๋ค.
const keyName = 'enabled'; // ๋ณ์๋ก ํค ์ด๋ฆ์ ์ ์ฅ
const obj = {};
obj[keyName] = true; // true
- ์ฌ๊ฐ์
keyName
์ดenabled
๋ก ํ๊ฐ๋๊ธฐ ๋๋ฌธ์,obj.enabled = true
์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ด์ง๋ง ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ํค ์ด๋ฆ์ ๋ชฐ๋๋ค. ์ด์ฒ๋ผ ํค๋ฅผ ๋์ค์ ๋ณ์๋ ํจ์์ ๊ฒฐ๊ณผ๋ก ๊ฒฐ์ ํ๋ ๊ฒ์ด๋์ ์์ฑ
์ด๋ค.
๐ก ๊ณ์ฐ๋ ์์ฑ๋ช (computed propery name)
๊ฐ์ฒด ๋ฆฌํฐ๋ด ์์์ [๋๊ดํธ]
๋ฅผ ์ฌ์ฉํด ๋์ ํค๋ฅผ ์ ์ธ ์์ ์ ๊ณ์ฐํด ํฌํจํ๋ ๋ฌธ๋ฒ์ด๋ค.
์ฆ, ๋๊ดํธ ์์ ์์ด ํ๊ฐ๋์ด ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ด ์์ฑ๋ช
(key)์ผ๋ก ๋ค์ด๊ฐ๋ค.
const keyName = 'enabled';
const obj = {
[keyName]: true,
};
console.log(obj); // { enabled: true }
๐ก ์์ฑ ๋จ์ถ ๊ตฌ๋ฌธ (Property Shorthand)
๋ณ์ ์ด๋ฆ๊ณผ ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์ด ๊ฐ์ ๋ key: key
๋์ key
๋ง ์จ๋ ๋๋ค.
- ReactProps ์ ๋ฌ ์
React ์ปดํฌ๋ํธ์์ props๋ฅผ ๋๊ธธ ๋ ์์ฃผ ๋ณผ ์ ์๋ค.
const user = {
name: "Binny",
age: 20,
};
// bad
<User name={user.name} age={user.age} />
// good
<User {...user} />
props๊ฐ ๊ฐ๊ฐ์ ๋ณ์์ผ ๊ฒฝ์ฐ
const name = "Binny";
const age = 20;
// bad
<User name={name} age={age} />
// good
<User name age />
- JSX ๋ฌธ๋ฒ์์๋ ๋์ผํ๋ค.
name={name}
โname
,age={age}
โage
- ํจ์ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ๋
function logUser({ name, age }) {
console.log(name, age);
}
const name = 'Binny';
const age = 20;
// bad
logUser({ name: name, age: age });
// good
logUser({ name, age });
name
,age
๋ณ์๋ฅผ ๊ทธ๋๋ก ๊ฐ์ฒด๋ก ์ ๋ฌํ๋ค๋ ์๋ฏธ๊ฐ ๋ช ํํ๋ค.
- API ์์ฒญ์ ๋ฐ์ดํฐ ๋ด์ ๋
const title = 'Hello';
const content = 'This is a post.';
// bad
axios.post('/api/posts', {
title: title,
content: content,
});
// good
axios.post('/api/posts', {
title,
content,
});
- ์ด๋ฐ ํจํด์
fetch
,axios
,supabase
๋ฑ ๋ชจ๋ API ํต์ ์์ ํํ๊ฒ ๋ฑ์ฅํ๋ค.
- ์ํ(state) ์ ๋ฐ์ดํธ ์
const [user, setUser] = useState({ name: '', age: 0 });
function updateUser(name, age) {
// bad
setUser({ name: name, age: age });
// good
setUser({ name, age });
}
- ๊ฐ๋ ์ฑ์ด ์ข์์ง๊ณ , ๋ถํ์ํ ๋ฐ๋ณต์ด ์ฌ๋ผ์ง๋ค.
๐ก ์ Object.prototype
์์ ์ง์ ํธ์ถํด์ผ ํ ๊น?
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ์ผ๋ฐ ๊ฐ์ฒด๋ Object.prototype
์ ์์๋ฐ๋๋ค.
์ฆ, ์ด๋ฐ ๊ฐ์ฒด๋ ๋ด๋ถ์ ์ผ๋ก๋ ์๋์ฒ๋ผ ์ฐ๊ฒฐ๋์ด ์๋ค.
const obj = { a: 1 };
// ๋ด๋ถ์ ์ผ๋ก๋ ์ด๋ ๊ฒ ๋์ํจ
obj.__proto__ === Object.prototype; // true
๊ทธ๋์ obj๋ Object.prototype
์์ ๋ฉ์๋๋ค์ ๋ฌผ๋ ค๋ฐ์์ ์ธ ์ ์๋ค.
obj.hasOwnProperty('a'); // true
- ํ์ง๋ง ํ๋กํ ํ์ ์ฒด์ธ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฌธ์ 1. ๊ฐ์ฒด๊ฐ ๊ฐ์ ์ด๋ฆ์ ์์ฑ์ ๊ฐ์ง ์๋ ์๋ค.
๊ฐ์ฒด๊ฐ hasOwnProperty
๋ผ๋ ํค๋ฅผ ์ง์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์์๋ฐ์ ๋ฉ์๋ ๋์ ๋ฎ์ด์ด ์์ฑ์ด ์ฌ์ฉ๋๋ค.
const obj = {
hasOwnProperty: false,
key: 'value',
};
obj.hasOwnProperty('key'); // TypeError: obj.hasOwnProperty is not a function
obj.hasOwnProperty
๋ ๋ ์ด์ ํจ์๊ฐ ์๋๋ค.false
๊ฐ์ผ๋ก ๋ฎ์ด์ผ๊ธฐ ๋๋ฌธ
๋ฌธ์ 2. Object.create(null)
๊ฐ์ ํ๋กํ ํ์
์ด ์๋ ๊ฐ์ฒด
const pureObj = Object.create(null);
console.log(pureObj.hasOwnProperty); // undefined
- ์ด ๊ฐ์ฒด๋
Object.prototype
์ ์์๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๋ด์ฅ ๋ฉ์๋hasOwnProperty
๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋๋ค. ๋ฐ๋ผ์pureObj.hasOwnProperty("x")
๋ฅผ ํธ์ถํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋์ Airbnb์ ๊ถ์ฅ ๋ฐฉ์
ํญ์ Object.prototype
์์ ์ง์ ๊ฐ์ ธ์ ์จ๋ผ!
Object.prototype.hasOwnProperty.call(obj, 'key');
- ์ด๋ ๊ฒ ํ๋ฉด,
obj
๊ฐ ์ด๋ค ๊ตฌ์กฐ์ด๋ ํญ์ ์๋ Object์ ์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
๋ ์์ ํ ํจํด: ์บ์ or ์ธ๋ถ ๋ชจ๋ ์ฌ์ฉ
๋ฐ๋ณต ํธ์ถ์ ์ค์ด๊ธฐ ์ํด ์ด๋ ๊ฒ ์บ์๋ฅผ ๊ถ์ฅํ๋ค.
const has = Object.prototype.hasOwnProperty;
if (has.call(obj, 'key')) {
console.log('์กด์ฌํจ');
}
๋๋ ์์ ๊ฒ์ฆ๋ NPM ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
import has from 'has';
if (has(obj, 'key')) {
console.log('์์ ํ๊ฒ ๊ฒ์ฌ๋จ');
}