🦎[λ”₯λ‹€μ΄λΈŒ μŠ€ν„°λ””] 34μž₯. μ΄ν„°λŸ¬λΈ”

이지·2021λ…„ 11μ›” 7일
0

DeepDive

λͺ©λ‘ 보기
10/13

μˆ˜μ—°

1. 기쑴의 순회 κ°€λŠ₯ν•œ 데이터 νƒ€μž…μ˜ μ–΄λ– ν•œ 점듀을 κ°œμ„ ν•˜κΈ° μœ„ν•΄μ„œ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ λ„μž…ν–ˆλŠ”μ§€ μ„€λͺ…ν•΄λ³΄μ‹œμ˜€.

-> es6 μ΄μ „μ˜ μˆœνšŒκ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜(λ°°μ—΄, λ¬Έμžμ—΄, μœ μ‚¬λ°°μ—΄κ°μ²΄, dom 등은 ν†΅μΌλœ κ·œμ•½ 없이 각자 λ‚˜λ¦„μ˜ ꡬ쑰λ₯Ό 가지고 λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μˆœνšŒν•  수 μžˆμ—ˆλ‹€. es6μ—μ„œλŠ” 순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜μ„ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” μ΄ν„°λŸ¬λΈ”λ‘œ ν†΅μΌν•˜μ—¬ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μΌμ›ν™”ν–ˆλ‹€.

λ§Œμ•½, λ‹€μ–‘ν•œ 데이터 κ³΅κΈ‰μžκ°€ 각자의 순회 방식을 κ°–λŠ”λ‹€λ©΄ 데이터 μ†ŒλΉ„μžλŠ” λ‹€μ–‘ν•œ 데이터 κ³΅κΈ‰μžμ˜ μˆœνšŒλ°©μ‹μ„ λͺ¨λ‘ μ§€μ›ν•΄μ•Όν•œλ‹€. μ΄λŠ” νš¨μœ¨μ μ΄μ§€ μ•Šλ‹€. ν•˜μ§€λ§Œ λ‹€μ–‘ν•œ 데이터 κ³΅κΈ‰μžκ°€ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λ„λ‘ κ·œμ •ν•˜λ©΄ 데이터 μ†ŒλΉ„μžλŠ” μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œλ§Œ μ§€μ›ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λ©΄ λœλ‹€.

이처럼 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ€ λ‹€μ–‘ν•œ 데이터 κ³΅κΈ‰μžκ°€ ν•˜λ‚˜μ˜ 순회 방식을 갖도둝 κ·œμ •ν•˜μ—¬ 데이터 μ†ŒλΉ„μžκ°€ 효율적으둜 λ‹€μ–‘ν•œ 데이터 κ³΅κΈ‰μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ 데이터 μ†ŒλΉ„μžμ™€ 데이터 κ³΅κΈ‰μžλ₯Ό μ—°κ²°ν•˜λŠ” 'μΈν„°νŽ˜μ΄μŠ€'역할을 ν•œλ‹€.

2. μ•„λž˜μ™€ 같은 데이터 ꡬ쑰λ₯Ό 무엇이라고 λΆ€λ₯΄λŠ”지 μ„€λͺ…ν•˜κ³  for...of문으둜 순회λ₯Ό ν•  수 μžˆλ„λ‘ λ³€ν™˜ν•΄λ³΄μ‹œμ˜€.

const testData = {
  0: 1,
  1: 2,
  2: 3,
  length: 3
}

//풀이
//Array.from 으둜 μœ μ‚¬λ°°μ—΄ 객체 λ˜λŠ” μ΄ν„°λŸ¬λΈ”μ„ λ°°μ—΄λ‘œ λ³€ν™˜ν•œλ‹€. 
const arr = Array.from(arrayLike);
console.log(arr);

3. μ΄ν„°λŸ¬λΈ”μ˜ κ°œλ…μ„ μ‚¬μš©ν•˜μ—¬ λ¬΄ν•œ ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³  μ΄λŸ¬ν•œ ν˜•νƒœλ‘œ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜κ³  μ‚¬μš©ν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” 효과λ₯Ό μ„€λͺ…ν•˜μ‹œμ˜€.

const fibonacciFunc = function() {

	let [pre, cur] = [0,1];
	
	return {
		[Symbol.iterator](){return this;}
		next(){
			[pre, cur] = [cur, pre+ cur];
			return {value: cur};
			}
		};
	};

for (const num of fibonacciFunc()){
	if(num > 10000) break;
	console.log(num);
}

//3개 μš”μ†Œλ§Œ 취득 
const [f1, f2, f3] = fibonacciFunc();
console.log(f1,f2,f3) 

-> μ΄ν„°λŸ¬λΈ”μ€ 데이터 κ³΅κΈ‰μžμ˜ 역할을 ν•œλ‹€. λ°°μ—΄μ΄λ‚˜ λ¬Έμžμ—΄λ“±μ€ λͺ¨λ“  데이터λ₯Ό 미리 ν™•λ³΄ν•œ λ‹€μŒ 데이터λ₯Ό κ³΅κΈ‰ν•œλ‹€. μœ„ μ˜ˆμ œλŠ” μ΄ν„°λŸ¬λΈ”μ€ 지연평가λ₯Ό 톡해 데이터λ₯Ό μƒμ„±ν•œλ‹€. 즉 데이터가 ν•„μš”ν•œ μ‹œμ μ— μƒμ„±ν•˜λŠ” 기법이닀.

-> for of 문의 경우, μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•  λ•Œ λ‚΄λΆ€μ—μ„œ Next λ©”μ„œλ“œλ₯Ό μˆœνšŒν•˜λŠ”λ°, λ°”λ‘œ μ΄λ•Œ 데이터가 μƒμ„±λœλ‹€. 이런 지연평가λ₯Ό μ‚¬μš©ν•˜λ©΄ λΉ λ₯Έμ‹€ν–‰μ†λ„λ₯Ό κΈ°λŒ€ν•  수 있고, λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό μ†ŒλΉ„ν•˜μ§€ μ•ŠμœΌλ©° λ¬΄ν•œλ„ ν‘œν˜„ν•  수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.

μ§€μ˜

1. μ΄ν„°λŸ¬λΈ”μΈμ§€ ν™•μΈν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€.


const isIterable = v => {
  //κ΅¬ν˜„ν•˜κΈ°
  return v !== null && typeof v[Symbol.iterator] === 'function';
}

isIterable([]); //true
isIterable(""); //true

2. λ‹€μŒ ν•¨μˆ˜λ₯Ό, μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ λ™μ‹œμ— μ΄ν„°λ ˆμ΄ν„°μΈ 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ‘œ λ³€κ²½ν•΄λ³΄μ‹œμ˜€.

const fibonacci = function() {
	[Symbol.iterator]() {
		let [pre, cur] = [0,1]; 
		const max = 10;

		return {
			next() {
				[pre, cur] = [cur, pre + cur];
				return {value : cur, done: cur >= max };
			}
		}
	}
}

for (const num of fibonacci){
	console.log(num);
}

//여기에 κ΅¬ν˜„ν•΄ μ£Όμ„Έμš”! 
  let [pre, cur] = [0, 1];
  const max = 10;
// 객체 자체λ₯Ό 리턴.. 
  return {
    [Symbol.iterator]() { return this; },
    next() {
      [pre, cur] = [cur, pre + cur];
      return { value: cur, done: cur >= max };
    }
  }
}

이 κ²½μš°μ—” μ΄ν„°λŸ¬λΈ” 자체λ₯Ό λ°˜ν™˜ν•œλ‹€. value값을 μ™ΈλΆ€μ—μ„œ λ³€κ²½ν•  수 있음.

이 κ²½μš°μ—λŠ” max κ°€ 고정이닀. fibonacci2 κ°€ ν•˜λ‚˜μ˜ μ΄ν„°λŸ¬λΈ” 객체 κ·Έ 자체.

profile
μ΄μ§€ν”Όμ§€λ ˆλͺ¬μŠ€ν€΄μ§€πŸ‹

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보