๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Language/JavaScript

[JavaScript] for...in ๊ณผ for...of์˜ ์ฐจ์ด

 

 

for...in ๊ณผ for...of์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

for...in

  • for...in ๋ฌธ์€ ์ƒ์†๋œ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ๋“ค์„ ํฌํ•จํ•˜์—ฌ ๊ฐ์ฒด์—์„œ ๋ฌธ์ž์—ด๋กœ ํ‚ค๊ฐ€ ์ง€์ •๋œ ๋ชจ๋“  ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
for (variable in object) {
  statement;
}

 

์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ(enumerable)

๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ดํŽด๋ณด๋ฉด [[Prototype]]์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ดํŽด๋ณด๋ฉด [[Prototype]] ์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Prototype์— ๋Œ€ํ•ด ๋จผ์ € ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Prototype

  • JS๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด์ด๋ฉฐ, ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ์†์„ฑ์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.
  • JS์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๋ถ€๋ชจ ์—ญํ• ์˜ ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด, ๋ถ€๋ชจ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ถ€๋ชจ ๊ฐ์ฒด๋ฅผ ํ”„๋กœํ† ํƒ€์ž…(Prototype)์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง์ ‘ ์ƒ์„ฑํ•œ ์†์„ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ์ƒ์†๋ฐ›์€ ์†์„ฑ์€ ์†์„ฑ ๋ช…์„ธ์˜ enumerable ๊ฐ’์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

enumerable

  • Object.getOwnPropertyDescriptor() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ enumerable ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • enumerable: false ๋ผ๋ฉด ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์†์„ฑ์ด๋ฉฐ, enumerable: true ๋ผ๋ฉด ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์ž…๋‹ˆ๋‹ค.
  • ์•„๋ž˜์™€ ๊ฐ™์ด toString ๋ฉ”์„œ๋“œ๋Š” ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์†์„ฑ์ด๊ธฐ์— for...in ๋ฃจํ”„๋กœ ๊ฐ์ฒด ์†์„ฑ์„ ๋ฐ˜๋ณตํ•˜๋”๋ผ๋„ toString์€ ๋‚˜์˜ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
const desc = Object.getOwnPropertyDescriptor(Object.prototype, "toString");

console.log(desc);

/*
{ value: [Function: toString],
  writable: true,
  enumerable: false,
  configurable: true }
*/

 

  • ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์†์„ฑ์„ ์ƒ์†๋ฐ›์•˜์œผ๋‚˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์ƒ์— ์žˆ๋Š” ์†์„ฑ๊ณผ ๊ฐ์ฒด ์ž์ฒด์— ์žˆ๋Š” ์†์„ฑ์ด ์ถฉ๋Œํ•œ๋‹ค๋ฉด, ๊ฐ์ฒด ์ž์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ์ฒด ์•ˆ์—์„œ toString์„ ์ƒˆ๋กญ๊ฒŒ ์ž‘์„ฑํ–ˆ์„ ๊ฒฝ์šฐ, ์ด๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์ƒ์˜ toString๊ณผ ์ถฉ๋Œํ•˜๊ธฐ์— ์ปค์Šคํ…€ํ•œ toString์ด ์šฐ์„ ์‹œ ๋˜์–ด for...in ๋ฃจํ”„์—์„œ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
const obj = {
  a: 1,
  b: 2,
  toString: function () {
    console.log("Custom toString");
  },
};

for (const key in obj) {
  console.log(obj[key]);
  /*
  1
  2
  ƒ () {
    console.log('Custom toString');
  }
  */
}

 

 


 

for...of

  • for...of ๋ฌธ์€ ๋ฐ˜๋ณต๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด(Array, Map, Set, String, TypedArray, Arguments ๊ฐ์ฒด ๋“ฑ)์— ๋Œ€ํ•ด์„œ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  • [Symbol.iterator] ์†์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ์š”์†Œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

for (variable of iterable) {
  statement;
}

 

[Symbol.iterator] ์†์„ฑ

  • ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜์—ฌ ์‚ดํŽด๋ณด๋ฉด Symbol.iterator ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • [Symbol.iterator] ์†์„ฑ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ์„ ๋จผ์ € ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ(iteration protocol)

  • ES6์—์„œ ๋„์ž…๋œ ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ(iteration protocol)์€ ๋ฐ์ดํ„ฐ ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ(๋ฏธ๋ฆฌ ์•ฝ์†๋œ ๊ทœ์น™)์ž…๋‹ˆ๋‹ค.
  • ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ๊ฐ์ฒด๋Š” for…of ๋ฌธ์œผ๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๊ณ  Spread ๋ฌธ๋ฒ•(...)์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ์—๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ(iterable protocol)๊ณผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ(iterator protocol)์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ค‘์—์„œ ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ดํ„ฐ๋Ÿฌ๋ธ”(iterable)์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๋Š” ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ์˜ํ•ด ์ƒ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 ๊ทธ๋Ÿผ ๋‹ค์‹œ [Symbol.iterator] ์ด์•ผ๊ธฐ๋กœ ๋Œ์•„๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ES6์—์„œ ์ œ๊ณตํ•˜๋Š” ๋นŒํŠธ์ธ ์ดํ„ฐ๋Ÿฌ๋ธ”์—๋Š” Array, String, Map, Set, TypedArray(Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array), DOM data structure(NodeList, HTMLCollection), Arguments๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์š”์†Œ๋“ค์˜ ์†์„ฑ์„ ์‚ดํŽด๋ณด๋ฉด Symbol.iterator๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, for...of๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

 

๊ฒฐ๋ก 

  • ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ฐ˜๋ณตํ•  ๋•Œ๋Š” for...in์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด, ๋ฌธ์ž์—ด, Map, Set ๋“ฑ์„ ๋ฐ˜๋ณตํ•  ๋•Œ๋Š” for...of๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ 

 

'Language > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JavaScript] parseInt( ) vs Number( )  (1) 2024.08.27
[JavaScript] JavaScript์˜ ์ผ๊ธ‰๊ฐ์ฒด๋ž€?  (0) 2024.07.05