Skip to content

Objects (๊ฐ์ฒด) โ€‹

๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๋‹ค. ์•„๋ž˜ ๊ฐ€์ด๋“œ๋Š” ์ผ๊ด€๋œ ์„ ์–ธ ๋ฐฉ์‹๊ณผ ์•ˆ์ „ํ•œ ์ ‘๊ทผ์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค.

๐Ÿงฉ Note

๊ฐ์ฒด์˜ ํ˜•ํƒœ, ์ƒ์„ฑ ๋ฐฉ์‹, ๋ณ€ํ˜• ๋ฐฉ์‹์„ ์ผ๊ด€๋œ ํŒจํ„ด์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ.
๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์ผ๊ด€์„ฑ๊ณผ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค.

1. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉ โ€‹

eslint: no-new-object

js
// bad
const item = new Object();

// good
const item = {};
  • new Object()๋ณด๋‹ค, {} ๋ฆฌํ„ฐ๋Ÿด์ด ์ง๊ด€์ ์ด๋‹ค.

2. ๋™์  ์†์„ฑ์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋Š” ๊ณ„์‚ฐ๋œ ์†์„ฑ๋ช…์„ ์‚ฌ์šฉ โ€‹

js
function getKey(k) {
  return `a key named ${k}`;
}

// bad
const obj = {
  id: 5,
  name: 'San Francisco',
};
obj[getKey('enabled')] = true; // ๋‚˜์ค‘์— 'enabled'๋ผ๋Š” ๋™์  ํ‚ค๋ฅผ ์ถ”๊ฐ€

// good
const obj = {
  id: 5,
  name: 'San Francisco',
  [getKey('enabled')]: true, // ๊ณ„์‚ฐ๋œ ์†์„ฑ
};
  • ๊ฐ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ์„ ํ•œ ๊ณณ์—์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ฐ„๋‹จํ•ด์ง„๋‹ค.
  • ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์„ ์–ธ ์‹œ์ ์— ์™„๊ฒฐ์‹œํ‚ค๋ผ๋Š” ๋œป!
๊ตฌ๋ถ„์ฝ”๋“œ์„ค๋ช…
๋™์  ์†์„ฑ ์ถ”๊ฐ€obj[key] = value๊ฐ์ฒด๋ฅผ ๋จผ์ € ๋งŒ๋“ค๊ณ , ๋‚˜์ค‘์— ํ‚ค๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•จ
๊ณ„์‚ฐ๋œ ์†์„ฑ๋ช…{ [key]: value }๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์•ˆ์—์„œ ๋ฐ”๋กœ ๋™์  ํ‚ค๋ฅผ ๊ณ„์‚ฐํ•ด ์†์„ฑ์œผ๋กœ ๋งŒ๋“ฆ
๐Ÿงฉ ๋™์  ์†์„ฑ (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 }

3. ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ถ• ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ โ€‹

eslint: object-shorthand

js
// bad
const atom = {
  value: 1,

  addValue: function (value) {
    return atom.value + value;
  },
};

// good
const atom = {
  value: 1,

  addValue(value) {
    return atom.value + value;
  },
};
  • ํ•จ์ˆ˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋†’๊ณ  ์ฝ”๋“œ๋Ÿ‰์ด ์ค„์–ด๋“ ๋‹ค.

4. ์†์„ฑ์˜ ๋‹จ์ถ• ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ โ€‹

eslint: object-shorthand

js
const lukeSkywalker = 'Luke Skywalker';

// bad
const obj = {
  lukeSkywalker: lukeSkywalker,
};

// good
const obj = {
  lukeSkywalker,
};
  • ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์„ ์–ธ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿงฉ ์†์„ฑ ๋‹จ์ถ• ๊ตฌ๋ฌธ (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 });
}
  • ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง€๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต์ด ์‚ฌ๋ผ์ง„๋‹ค.

5. ๋‹จ์ถ• ๊ตฌ๋ฌธ ์†์„ฑ์€ ๊ฐ์ฒด ์„ ์–ธ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋ชจ์œผ๊ธฐ โ€‹

js
const anakinSkywalker = "Anakin Skywalker";
const lukeSkywalker = "Luke Skywalker";

// bad
const obj = {
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  lukeSkywalker,
  episodeThree: 3,
  mayTheFourth: 4,
  anakinSkywalker,
};

// good
const obj = {
  lukeSkywalker,
  anakinSkywalker,
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  episodeThree: 3,
  mayTheFourth: 4,
};
  • ๋‹จ์ถ• ๊ตฌ๋ฌธ ์†์„ฑ์„ ํ•œ ๊ณณ์— ๋ชจ์œผ๋ฉด ์–ด๋–ค ์†์„ฑ์ด ์ถ•์•ฝ๋œ ๋ณ€์ˆ˜๋ช…์ธ์ง€ ๋น ๋ฅด๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

6. ์œ ํšจํ•˜์ง€ ์•Š์€ ์‹๋ณ„์ž์—๋งŒ ๋”ฐ์˜ดํ‘œ ์†์„ฑ์„ ์‚ฌ์šฉ โ€‹

eslint: quote-props

js
// bad
const bad = {
  'foo': 3,
  'bar': 4,
  'data-blah': 5,
};

// good
const good = {
  foo: 3,
  bar: 4,
  'data-blah': 5,
  // data-blah๋Š” ์‹๋ณ„์ž๋กœ ์“ธ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„, ํ•˜์ดํ”ˆ- ํฌํ•จ ์‹œ ๋บ„์…ˆ์œผ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ
};
  • ์ฝ”๋“œ ํ•˜์ด๋ผ์ดํŒ…์ด ์ •ํ™•ํ•ด์ง€๊ณ , JS ์—”์ง„์ด ๋” ์‰ฝ๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

7. Object.prototype์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์‹œ์˜ค โ€‹

eslint: no-prototype-builtins
Object.prototype ๋ฉ”์„œ๋“œ: hasOwnProperty, propertyIsEnumerable, isPrototypeOf ๋“ฑ๋“ฑ

๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ๋ง๊ณ , Object.prototype์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊บผ๋‚ด์„œ ํ˜ธ์ถœ

js
// bad
console.log(object.hasOwnProperty(key));

// good
console.log(Object.prototype.hasOwnProperty.call(object, key));

// best
const has = Object.prototype.hasOwnProperty; // ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„์—์„œ ํ•œ ๋ฒˆ ์บ์‹œ
console.log(has.call(object, key));

/* or */
import has from 'has'; // https://www.npmjs.com/package/has
console.log(has(object, key));
  • ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋“ค์€ ๊ฐ์ฒด์˜ ์†์„ฑ์— ์˜ํ•ด ๊ฐ€๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • hasOwnProperty๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜๋„ ์žˆ๊ณ , Object.create(null)์ฒ˜๋Ÿผ ํ”„๋กœํ† ํƒ€์ž…์ด ์—†๋Š” ๊ฐ์ฒด๋„ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๐Ÿงฉ ์™œ 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('์•ˆ์ „ํ•˜๊ฒŒ ๊ฒ€์‚ฌ๋จ');
}

8. ๊ฐ์ฒด ์–•์€ ๋ณต์‚ฌ๋Š” Object.assign๋Œ€์‹  ์ „๊ฐœ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ โ€‹

ํŠน์ • ์†์„ฑ์ด ์ƒ๋žต๋œ ์ƒˆ๋กœ์šด ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ๊ฐ์ฒด ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ.

eslint: prefer-object-spread

js
// ๐Ÿ‘Ž very bad
// Object.assign(target, source)๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž(target)๋ฅผ ๋ณ€ํ˜•ํ•œ๋‹ค.
// ์ฆ‰, ๋ณต์‚ฌ๋ณธ์ด ์•„๋‹ˆ๋ผ ์›๋ณธ ์ž์ฒด๊ฐ€ ์ˆ˜์ •๋œ๋‹ค.
const original = { a: 1, b: 2 };
const copy = Object.assign(original, { c: 3 }); // ์›๋ณธ ๋ณ€ํ˜•
console.log(original); // { a: 1, b: 2, c: 3 }

// delete๋Š” ์—ฌ๊ธฐ์„œ "๋ณต์‚ฌ๋ณธ์„ ์ˆ˜์ •ํ•˜๋ฉด ์›๋ณธ๋„ ๋ฐ”๋€๋‹ค"๋Š” ๊ฑธ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ์˜ˆ์‹œ
// ์‹ค์ œ๋กœ delete copy.a๋ฅผ ํ•˜๋ฉด original.a๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค. ๋ถˆ๋ณ€์„ฑ ๊นจ์ง
delete copy.a;
console.log(original); // { b: 2, c: 3 }

// ๐Ÿ‘Ž bad
// ์›๋ณธ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐ˜๋“œ์‹œ "๋นˆ ๊ฐ์ฒด({})"๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
// ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ๋งค๋ฒˆ {}๋ฅผ ์จ์•ผ ํ•ด์„œ ์žฅํ™ฉํ•˜๊ณ , ์‹ค์ˆ˜๋กœ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ฉด ์˜๋„์น˜ ์•Š์€ ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๋ฐœ์ƒ
const original = { a: 1, b: 2 };
const copy = Object.assign({}, original, { c: 3 });
console.log(copy); // {a: 1, b: 2, c: 3}

// ๐Ÿ‘ good
// ์ „๊ฐœ ์—ฐ์‚ฐ์ž(spread operator)๋Š” ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ ์–•์€ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•์ด๋‹ค.
// ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
const original = { a: 1, b: 2 };
const copy = { ...original, c: 3 };
console.log(original); // { a: 1, b: 2 } ๐Ÿ‘ ์›๋ณธ ๊ทธ๋Œ€๋กœ
console.log(copy); // { a: 1, b: 2, c: 3 } ๐Ÿ‘ ๋ณต์‚ฌ ์„ฑ๊ณต

// ํŠน์ • ์†์„ฑ์„ ์ œ์™ธํ•˜๊ณ  ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด "๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ž(rest operator)"๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
// ์ด ๋ฐฉ์‹์€ delete๋ณด๋‹ค ํ›จ์”ฌ ์•ˆ์ „ํ•˜๊ณ , ๋ถˆ๋ณ€์„ฑ๋„ ์ง€ํ‚จ๋‹ค.
const { a, ...noA } = copy; // a๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ๋ณต์‚ฌ
console.log(noA); // { b: 2, c: 3 }
  • ์ „๊ฐœ ์—ฐ์‚ฐ์ž๋Š” ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๋ฉฐ, ์›๋ณธ ๊ฐ์ฒด๋ฅผ ๋ณ€ํ˜•ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Object.assign๋ณด๋‹ค ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ์—๋Ÿฌ๋ฅผ ์˜ˆ๋ฐฉํ•œ๋‹ค.


๊ทœ์น™ํ•ต์‹ฌ ์›์น™Airbnb์˜ ์˜๋„
1. ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ๋ฒ• ์‚ฌ์šฉ{}๊ฐ€ new Object()๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ณ  ์งง๋‹ค์ƒ์„ฑ ์ผ๊ด€์„ฑ
2. ๊ณ„์‚ฐ๋œ ์†์„ฑ๋ช…๊ฐ์ฒด๋ฅผ ์„ ์–ธ ์‹œ์ ์— ์™„๊ฒฐ์œ ์ง€๋ณด์ˆ˜์„ฑ
3. ๋ฉ”์„œ๋“œ ๋‹จ์ถ• ๊ตฌ๋ฌธfunction ์ œ๊ฑฐ๋กœ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”
4. ์†์„ฑ ๋‹จ์ถ• ๊ตฌ๋ฌธkey: key โ†’ key์ค‘๋ณต ์ œ๊ฑฐ
5. ๋‹จ์ถ• ์†์„ฑ ๋ชจ์œผ๊ธฐ์‹œ๊ฐ์  ๊ทธ๋ฃนํ™”๊ตฌ์กฐ ๋ช…ํ™•์„ฑ
6. ๋”ฐ์˜ดํ‘œ ์†์„ฑ์œ ํšจํ•˜์ง€ ์•Š์€ ์‹๋ณ„์ž๋งŒ ์‚ฌ์šฉ์ผ๊ด€์„ฑ, ์ตœ์ ํ™”
7. Object.prototype ํ˜ธ์ถœ์›๋ณธ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผ์•ˆ์ •์„ฑ, ๋ณด์•ˆ
8. Object.assign ๋Œ€์‹  Spread๋ถˆ๋ณ€์„ฑ ์œ ์ง€, ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ