Skip to content

Objects โ€‹

๐Ÿงฉ Related

๐Ÿ’ก ๋™์  ์†์„ฑ (Dynamic Property)

์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์— ๋‚˜์ค‘์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
์ฆ‰, ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์–ด๋–ค ํ‚ค๋ฅผ ์“ธ์ง€ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๋‹ค.

js
const keyName = 'enabled'; // ๋ณ€์ˆ˜๋กœ ํ‚ค ์ด๋ฆ„์„ ์ €์žฅ
const obj = {};

obj[keyName] = true; // true
  • ์—ฌ๊ฐ€์„œ keyName์ด enabled๋กœ ํ‰๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์—, obj.enabled = true์™€ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ด์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ํ‚ค ์ด๋ฆ„์„ ๋ชฐ๋ž๋‹ค. ์ด์ฒ˜๋Ÿผ ํ‚ค๋ฅผ ๋‚˜์ค‘์— ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋™์  ์†์„ฑ์ด๋‹ค.
๐Ÿ’ก ๊ณ„์‚ฐ๋œ ์†์„ฑ๋ช… (computed propery name)

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์•ˆ์—์„œ [๋Œ€๊ด„ํ˜ธ]๋ฅผ ์‚ฌ์šฉํ•ด ๋™์  ํ‚ค๋ฅผ ์„ ์–ธ ์‹œ์ ์— ๊ณ„์‚ฐํ•ด ํฌํ•จํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.
์ฆ‰, ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ์‹์ด ํ‰๊ฐ€๋˜์–ด ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์ด ์†์„ฑ๋ช…(key)์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

js
const keyName = 'enabled';

const obj = {
  [keyName]: true,
};

console.log(obj); // { enabled: true }
๐Ÿ’ก ์†์„ฑ ๋‹จ์ถ• ๊ตฌ๋ฌธ (Property Shorthand)

๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์ด ๊ฐ™์„ ๋•Œ key: key ๋Œ€์‹  key๋งŒ ์จ๋„ ๋œ๋‹ค.

  1. ReactProps ์ „๋‹ฌ ์‹œ

React ์ปดํฌ๋„ŒํŠธ์—์„œ props๋ฅผ ๋„˜๊ธธ ๋•Œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

jsx
const user = {
  name: "Binny",
  age: 20,
};

// bad
<User name={user.name} age={user.age} />

// good
<User {...user} />

props๊ฐ€ ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜์ผ ๊ฒฝ์šฐ

jsx
const name = "Binny";
const age = 20;

// bad
<User name={name} age={age} />

// good
<User name age />
  • JSX ๋ฌธ๋ฒ•์—์„œ๋„ ๋™์ผํ•˜๋‹ค.
    name={name} โ†’ name, age={age} โ†’ age

  1. ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ๋•Œ
js
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 ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค.

  1. API ์š”์ฒญ์— ๋ฐ์ดํ„ฐ ๋‹ด์„ ๋•Œ
js
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 ํ†ต์‹ ์—์„œ ํ”ํ•˜๊ฒŒ ๋“ฑ์žฅํ•œ๋‹ค.

  1. ์ƒํƒœ(state) ์—…๋ฐ์ดํŠธ ์‹œ
js
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์„ ์ƒ์†๋ฐ›๋Š”๋‹ค.
์ฆ‰, ์ด๋Ÿฐ ๊ฐ์ฒด๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

js
const obj = { a: 1 };

// ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•จ
obj.__proto__ === Object.prototype; // true

๊ทธ๋ž˜์„œ obj๋Š” Object.prototype ์•ˆ์˜ ๋ฉ”์„œ๋“œ๋“ค์„ ๋ฌผ๋ ค๋ฐ›์•„์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

js
obj.hasOwnProperty('a'); // true
  • ํ•˜์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ 1. ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ์ด๋ฆ„์˜ ์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.
๊ฐ์ฒด๊ฐ€ hasOwnProperty๋ผ๋Š” ํ‚ค๋ฅผ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ ๋Œ€์‹  ๋ฎ์–ด์“ด ์†์„ฑ์ด ์‚ฌ์šฉ๋œ๋‹ค.

js
const obj = {
  hasOwnProperty: false,
  key: 'value',
};

obj.hasOwnProperty('key'); // TypeError: obj.hasOwnProperty is not a function
  • obj.hasOwnProperty๋Š” ๋” ์ด์ƒ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค. false ๊ฐ’์œผ๋กœ ๋ฎ์–ด์ผ๊ธฐ ๋•Œ๋ฌธ

๋ฌธ์ œ 2. Object.create(null) ๊ฐ™์€ ํ”„๋กœํ† ํƒ€์ž…์ด ์—†๋Š” ๊ฐ์ฒด

js
const pureObj = Object.create(null);

console.log(pureObj.hasOwnProperty); // undefined
  • ์ด ๊ฐ์ฒด๋Š” Object.prototype์„ ์ƒ์†๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ๋‚ด์žฅ ๋ฉ”์„œ๋“œhasOwnProperty๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ pureObj.hasOwnProperty("x")๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋ž˜์„œ Airbnb์˜ ๊ถŒ์žฅ ๋ฐฉ์‹
ํ•ญ์ƒ Object.prototype์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์™€ ์จ๋ผ!

js
Object.prototype.hasOwnProperty.call(obj, 'key');
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, obj๊ฐ€ ์–ด๋–ค ๊ตฌ์กฐ์ด๋“  ํ•ญ์ƒ ์›๋ž˜ Object์˜ ์ •์‹ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๋” ์•ˆ์ „ํ•œ ํŒจํ„ด: ์บ์‹œ or ์™ธ๋ถ€ ๋ชจ๋“ˆ ์‚ฌ์šฉ
๋ฐ˜๋ณต ํ˜ธ์ถœ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ์บ์‹œ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

js
const has = Object.prototype.hasOwnProperty;
if (has.call(obj, 'key')) {
  console.log('์กด์žฌํ•จ');
}

๋˜๋Š” ์•„์˜ˆ ๊ฒ€์ฆ๋œ NPM ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

js
import has from 'has';
if (has(obj, 'key')) {
  console.log('์•ˆ์ „ํ•˜๊ฒŒ ๊ฒ€์‚ฌ๋จ');
}