[๐ŸŒณjavascript] for in/ for of, enumerable, iterable

h-a-n-aยท2023๋…„ 3์›” 14์ผ
1

๐ŸŒณjavascript

๋ชฉ๋ก ๋ณด๊ธฐ
13/17
const arr=[1,2,3,4,5,6]
for (let i=0; i<arr.length;i++){
  ์–ด์ฉŒ๊ตฌ์ €์ฉŒ๊ตฌ์ฝ”๋“œ}

๋ฐ˜๋ณต๋ฌธ์˜ ๋Œ€ํ‘œ์ ์ธ for๋ฌธ. ์ด์™ธ์—๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐ˜๋ณต๋ฌธ๋“ค๋„ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ for in / for of ๋‹ค.

์•„๋ž˜์˜ ๋ฐ˜๋ณต๋ฌธ๋“ค์€ ์œ„์—์„œ ๋ณธ for๋ฌธ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, array๋‚˜ object์—์„œ ์ž๋ฃŒ๋ฅผ ๊บผ๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

for in (Object ์ „์šฉ)

์˜ค๋ธŒ์ ํŠธ ์ž๋ฃŒํ˜•์— ์ €์žฅ๋œ ์ž๋ฃŒ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

let obj = {
  name: 'Lee',
  age: 27,
}
for (let key์ด๋ฆ„์ ๋Š”๊ณณ์ธ๋ฐ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜์ž‘๋ช…ํ•˜์‡ผ in obj){
  console.log(obj[key์ด๋ฆ„์ ๋Š”๊ณณ์ธ๋ฐ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜์ž‘๋ช…ํ•˜์‡ผ])}

๋ฐ˜๋ณต๋ฌธ์€ ์˜ค๋ธŒ์ ํŠธ ์ž๋ฃŒ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค key~~๋ณ€์ˆ˜๋Š” name,age๋ผ๋Š” key๊ฐ’์ด ๋œ๋‹ค. ์ฆ‰, ๋ฐ˜๋ณต์‹œ๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜๋Š” key๊ฐ’์„ ์ด์šฉํ•˜๋ฉด ์˜ค๋ธŒ์ ํŠธ ๋‚ด์˜ ์ž๋ฃŒ๋ฅผ ๋ชจ๋‘ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
์ฃผ์˜ํ•  ์ ์€ ์˜ค๋ธŒ์ ํŠธ๋ช…[key๊ฐ’์ž‘๋ช…] ์ด๋ ‡๊ฒŒ ์“ด๋‹ค๋Š” ๊ฒƒ!

enumerable(์…€ ์ˆ˜ ์žˆ๋Š”)

for in ๋ฐ˜๋ณต๋ฌธ์€ ์…€ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

Object.getOwnPropertyDescriptor(obj, "age"); ์„ ์“ฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์ด ์ถœ๋ ฅ๋œ๋‹ค.
// {value: 27, writable: true, enumerable: true, configurable: true}

enumerable์€ ์…€ ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๋œปํ•˜๋ฉฐ, true์—ฌ์•ผ for in ๋ฐ˜๋ณต๋ฌธ์—์„œ ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ถ€๋ชจ์˜ prototype๋„ ๋ฐ˜๋ณตํ•ด์ค€๋‹ค

class Parent{
}
Parent.prototype.name='Kim'
const ์˜ค๋ธŒ์ ํŠธ = new Parent()
์˜ค๋ธŒ์ ํŠธ.age=29
for (let key in obj){
  console.log(obj[key])} // Kim

๊ทผ๋ฐ ๋ถ€๋ชจ prototype์„ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ ค์„œ ์ถœ๋ ฅํ•ด๋‚ผ์ผ์€ ๋ณ„๋กœ ์—†๊ธดํ•˜๋‹ค. ์–ด์จŒ๋“  ๋ถ€๋ชจ๋‹˜๊บผ ๋ง๊ณ  ๋‚ด๊ป๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์œผ๋ฉด hasOwnProperty()๋ผ๋Š” ๊ฐ์ฒด๊ธฐ๋ณธ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ๋‚ด์žฅํ•จ์ˆ˜ ์ด์šฉํ•˜๋ฉด ๋‚ด๊บผ๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

for (let key in obj){
  if(์˜ค๋ธŒ์ ํŠธ.hasOwnProperty(key)) {
    console.log(obj[key]); //29
  }
}

for of (iterable ์ „์šฉ)

for of ๋ฐ˜๋ณต๋ฌธ์€
Array, string, arguments, NodeList, Map, Set
iterableํ•œ ์ž๋ฃŒํ˜•์—๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ.

[Symbeol.iterator]()์ด๋ผ๋Š” ์ผ์ข…์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž๋ฃŒํ˜•๋“ค์„ ๋œปํ•œ๋‹ค.

๊ทธ๋Ÿผ ์‹ฌ๋ณผ์ด ๋ญก๋‹ˆ๊นŒ?

Symbol

์‹ฌ๋ณผ์€ ์˜ค๋ธŒ์ ํŠธ ์ž๋ฃŒํ˜•์— ๋น„๋ฐ€์Šค๋Ÿฐ key ๊ฐ’์„ ๋ถ€์—ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์›๋ž˜ object ์ž๋ฃŒํ˜•์—๋Š” ๋ฌธ์ž๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ES6๋ถ€ํ„ฐ๋Š” Symbol๋„ key ๊ฐ’์œผ๋กœ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
์‹ฌ๋ณผ ๋งŒ๋“œ๋Š” ๋ฒ•: const ์‹ฌ๋ณผ = Symbol('์–ด์ฉŒ๊ตฌ์ €์ฉŒ๊ตฌ์„ค๋ช…')
key ๊ฐ’์œผ๋กœ ๋„ฃ๋Š” ๋ฒ•: person[์‹ฌ๋ณผ]=100

const person = {
  name:'Lee'
}
person.weight=45

const weight=Symbol('๋‚˜์˜ ๋น„๋ฐ€์Šค๋Ÿฐ ๋ชธ๋ฌด๊ฒŒ')
person[weight]=200 // ํ˜น์€ const person = {name:'Lee', [weight]:200} ์ด๊ฒƒ๋„ ๊ฐ€๋Šฅ

 console.log(person.weight)// 45

๋˜ํ•œ, Symbol์€ ๋ฐ˜๋ณต๋ฌธ์—์„œ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— for in ๋ฌธ์„ ์จ์„œ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ ค๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค.

Symbol.for()์„ ์“ฐ๋ฉด ์ „์—ญ์‹ฌ๋ณผ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

const a = Symbol.for('์–ด์ฉŒ๊ตฌ์„ค๋ช…')
const b = Symbol.for('์–ด์ฉŒ๊ตฌ์„ค๋ช…')
console.log(a===b)  //true

.for()์„ ์จ์„œ ์ƒˆ๋กœ์šด Symbol์„ ๋งŒ๋“ค๊ณ  ๊ฐ™์€ ์„ค๋ช…์ด ์“ฐ๊ฒŒ๋˜๋ฉด
์ด๋ฏธ ๊ทธ ์„ค๋ช…์„ ์“ฐ๊ณ  ์žˆ๋Š” Symbol์„ ๊ทธ ์ž๋ฆฌ์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์ฐธ๊ณ .

const a = Symbol.for('์–ด์ฉŒ๊ตฌ์„ค๋ช…')
const b = a
console.log(a===b)  //true

  • ์˜ค๋Š˜ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๊ฒƒ
    Symbol์ด๋ผ๋Š” ๊ฑธ ํ†ตํ•ด ๋น„๋ฐ€์Šค๋Ÿฐ Key ๊ฐ’์„ ์“ฐ๋Š” ๋ฒ•์„ ๋ฐฐ์› ๋‹ค.

  • ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ๋“ค ์ค‘ ๋” ์•Œ๊ณ  ์‹ถ๊ฑฐ๋‚˜ ๊ถ๊ธˆํ•œ ๊ฒƒ
    ๊ทผ๋ฐ ์–ด๋”ฐ ์จ๋จน๋Š”๊ฑธ๊นŒ?

  • ์˜ค๋Š˜์˜ ์†Œ๊ฐ

LA ํ•˜๋ฉด ๋– ์˜ค๋ฅด๋Š” ๋ผ๋ผ๋žœ๋“œ.
์š”์ฆ˜ ๋‚˜์˜ ์ตœ์• ์‚ฌ์ง„.

profile
ํ•˜๋ฃจํ•˜๋ฃจ๊ฐ€ ์—ฐ์Šต์ด๋‹ˆ ๋‚ด์ผ์€ ๋” ๊ฐ•ํ•ด์งˆ ๊ฒ๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€