ìí íë¡í ì½ì ìë¡ì´ ë´ì¥ ê°ì²´ ëë êµ¬ë¬¸ì´ ìë íë¡í ì½ì ëë¤. ì´ë¬í íë¡í ì½ì ëª ê°ì§ ê·ì¹ì ë°ë¼ 모ë ê°ì²´ìì 구íë ì ììµëë¤.
íë¡í ì½ì ìí ê°ë¥ íë¡í ì½ê³¼ ë°ë³µì íë¡í ì½ë¡ ë ê°ì§ê° ììµëë¤.
ìí ê°ë¥ íë¡í ì½ìí ê°ë¥ íë¡í ì½ì ì¬ì©íë©´ JavaScript ê°ì²´ë¥¼ for...of
구조ìì ë°ë³µëë ê°ê³¼ ê°ì ìí ëìì ì ìíê±°ë ì¬ì©ì ì§ì í ì ììµëë¤. Object
ìë ë¬ë¦¬ Array
ëë Map
ê³¼ ê°ì ì¼ë¶ ë´ì¥ ì íì 기본 ìí ëìì´ ìë ë´ì¥ ìí ê°ë¥ í목ì
ëë¤.
ìí ê°ë¥ì´ ë기ìí´ ê°ì²´ë ë°ëì @@iterator
ë©ìë를 구íí´ì¼ í©ëë¤. ì¦, ê°ì²´(ëë íë¡í íì
ì²´ì¸ì ê°ì²´ ì¤ íë)ì ìì Symbol.iterator
를 íµí´ ì´ì©í ì ìë @@iterator
í¤ê° ìë ìì±ì´ ìì´ì¼ í©ëë¤.
[Symbol.iterator]
ë°ë³µì íë¡í ì½ì ì¤ìíë ê°ì²´ë¥¼ ë°ííë ì¸ìê° ìë í¨ì.
ê°ì²´ë¥¼ ìíí´ì¼ í ëë§ë¤(ì: for...of
루í ìì ì) @@iterator
ë©ìëë ì¸ì ì ë¬ ìì´ í¸ì¶ëê³ , ë°íë ë°ë³µìë ë°ë³µí ê°ì ê°ì ¸ì¤ë ë° ì¬ì©ë©ëë¤.
ì´ ì¸ìê° ìë í¨ìë, ìí ê°ë¥ ê°ì²´ì ë©ìëë¡ í¸ì¶ë©ëë¤. ë°ë¼ì í¨ì ë´ìì this
í¤ìë를 ì¬ì©íì¬ ìí ê°ë¥ ê°ì²´ì ìì±ì ì ê·¼íê³ ìí ì¤ì ì ê³µí í목ì ê²°ì í ì ììµëë¤.
ì´ í¨ìë íë²í í¨ìì´ê±°ë ì ëë ì´í° í¨ìì¼ ì ìê³ , í¸ì¶ ì ë°ë³µì ê°ì²´ê° ë°íë©ëë¤. ì ëë ì´í° í¨ì ë´ìì ê° í목ì yield
를 ì¬ì©íì¬ ì ê³µë ì ììµëë¤.
ë°ë³µì íë¡í ì½ì ì ííê±°ë 무íí ì¼ë ¨ì ê°ì ìì±íë íì¤ ë°©ë²ì ì ìíê³ , 모ë ê°ì´ ìì±ëìì ë ì ì¬ì ì¼ë¡ ë°í ê°ì ì ìí©ëë¤.
ê°ì²´ë ë¤ì ì미 ì²´ê³ë¥¼ ì¬ì©íì¬ next()
ë©ìë를 구íí ë ë°ë³µìê° ë©ëë¤.
next()
0ê° ëë 1ê°ì ì¸ì를 íì©íê³ IteratorResult
ì¸í°íì´ì¤(ìë 참조)를 ì¤ìíë ê°ì²´ë¥¼ ë°ííë í¨ìì
ëë¤. ë´ì¥ ì¸ì´ 기ë¥(for...of
ë±)ì´ ë°ë³µì를 ì¬ì©í ë ê°ì²´ê° ìë ê°(false
ëë undefined
ë±)ì´ ë°íëë©´ TypeError
("iterator.next() returned a non-object value"
)ê° ë°ìí©ëë¤.
모ë ë°ë³µì íë¡í ì½ ë©ìë(next()
, return()
, ê·¸ë¦¬ê³ throw()
)ë IteratorResult
ì¸í°íì´ì¤ë¥¼ 구ííë ê°ì²´ë¥¼ ë°íí´ì¼ í©ëë¤. ë¤ì ìì±ì´ ë°ëì ìì´ì¼ í©ëë¤.
done
Optional
ë¶ë¦¬ì¸ ê°ì¼ë¡, ë°ë³µìê° ìíì¤ìì ë¤ì ê°ì ìì±í ì ìë ê²½ì°ì false
ì
ëë¤. (ì´ë done
ìì±ì ì§ì íì§ ìë ê²ê³¼ ê°ìµëë¤.)
ë°ë³µìê° ìíì¤ë¥¼ ìë£í ê²½ì°ì ì´ ê°ì true
ì
ëë¤. ì´ë value
ë ë°ë³µìì ë°í ê°ì ì íì ì¼ë¡ ì§ì í©ëë¤.
value
Optional
ë°ë³µìê° ë°ííë 모ë JavaScript ê°ì
ëë¤. done
ì´ true
ì´ë©´ ìëµí ì ììµëë¤.
ì¤ì ë¡ ë ìì±ì´ 모ë ì격íê² ì구ëì§ ììµëë¤. ìì±ì´ ìë ê°ì²´ê° ë°íëë©´ ì¬ì¤ì { done: false, value: undefined }
ì ëì¼í©ëë¤.
ë°ë³µìê° done: true
ë¡ ê²°ê³¼ë¥¼ ë°ííë©´ next()
ì ëí 모ë íì í¸ì¶ë done: true
를 ë°íí ê²ì¼ë¡ ììëì§ë§ ì´ë ì¸ì´ ìì¤ìì ê°ì ëì§ ììµëë¤.
next
ë©ìëë ë©ìë 본문ìì ì¬ì©í ì ìë ê°ì ë°ì ì ììµëë¤. ë´ì¥ ì¸ì´ 기ë¥ì ì´ë í ê°ë ì ë¬íì§ ììµëë¤. ì ëë ì´í°ì next
ë©ìëë¡ ì ë¬ë ê°ì í´ë¹ yield
ííìì ê°ì´ ë©ëë¤.
ë°ë³µìë ì íì ì¼ë¡ return(value)
ì throw(exception)
ë©ìë를 구íí ì ììµëë¤. ì´ ë©ìëë í¸ì¶ë ë í¸ì¶ìê° ìí를 ìë£íì¼ë©°, íìí ì 리(ì: ë°ì´í°ë² ì´ì¤ ì°ê²° ë«ê¸°)를 ìíí ì ììì ë°ë³µììê² ì립ëë¤.
return(value)
Optional
0ê° ëë 1ê°ì ì¸ì를 íì©íê³ IteratorResult
ì¸í°íì´ì¤ë¥¼ ì¤ìíë ê°ì²´ë¥¼ ë°ííë í¨ìì
ëë¤. ì¼ë°ì ì¼ë¡ value
ë ì ë¬ë vlaue
ì ê°ê³ done
ì true
ì
ëë¤. ì´ ë©ìë를 í¸ì¶íë©´ ë°ë³µììê² í¸ì¶ìê° ë ì´ì next()
를 í¸ì¶ì í ìëê° ìì¼ë©°, ì 리 ìì
ì ìíí ì ììì ì립ëë¤.
throw(exception)
Optional
0ê° ëë 1ê°ì ì¸ì를 íì©íê³ IteratorResult
ì¸í°íì´ì¤ë¥¼ ì¤ìíë ê°ì²´ë¥¼ ë°ííë í¨ìì
ëë¤. ì¼ë°ì ì¼ë¡ done
ì true
ì
ëë¤. ì´ ë©ìë를 í¸ì¶íë©´ ë°ë³µììê² í¸ì¶ìê° ì¤ë¥ ì¡°ê±´ì ê°ì§íìì ì리며, exception
ì ì¼ë°ì ì¼ë¡ Error
ì¸ì¤í´ì¤ì
ëë¤.
ì°¸ê³ : í¹ì ê°ì²´ê° ë°ë³µì íë¡í ì½ì 구ííëì§ ì¬ë¶ë¥¼ ë°ì¬ì ì¼ë¡(ì¦, ì¤ì ë¡ next()
를 í¸ì¶íê³ ë°íë 결과를 íì¸íì§ ìê³ ë) ì ì ììµëë¤.
ë°ë³µì를 ìí ê°ë¥ì¼ë¡ ë§ëë ê²ì ë§¤ì° ì½ìµëë¤. this
를 ë°ííë [@@iterator]()
ë©ìë를 구ííê¸°ë§ íë©´ ë©ëë¤.
// ë°ë³µì íë¡í ì½ê³¼ ìí ê°ë¥ì 모ë ë§ì¡±
const myIterator = {
next() {
// ...
},
[Symbol.iterator]() {
return this;
},
};
ì´ë¬í ê°ì²´ë¥¼ ìí ê°ë¥ ë°ë³µìë¼ê³ í©ëë¤. ì´ë ê² íë©´ ìí ê°ë¥ì 기ëíë ë¤ìí 구문ìì ë°ë³µì를 ì¬ì©í ì ììµëë¤. ë°ë¼ì ìí ê°ë¥ì 구ííì§ ìê³ ë°ë³µì íë¡í ì½ì 구ííë ê²ì ê±°ì ì ì©íì§ ììµëë¤. (ì¤ì ë¡ ê±°ì 모ë 구문과 APIë ë°ë³µìê° ìëë¼ ìí ê°ë¥ì 기ëí©ëë¤.) ì ëë ì´í° ê°ì²´ê° ê·¸ ìì ëë¤.
const aGeneratorObject = (function* () {
yield 1;
yield 2;
yield 3;
})();
console.log(typeof aGeneratorObject.next);
// "function" â next ë©ìë(ì¬ë°ë¥¸ 결과를 ë°í)ê° ìì¼ë¯ë¡ ë°ë³µìì
ëë¤.
console.log(typeof aGeneratorObject[Symbol.iterator]);
// "function" â @@iterator ë©ìë(ì¬ë°ë¥¸ ë°ë³µì를 ë°í)ê° ìì¼ë¯ë¡ ìí ê°ë¥ì
ëë¤.
console.log(aGeneratorObject[Symbol.iterator]() === aGeneratorObject);
// true â @@iterator ë©ìëë ìì (ë°ë³µì)ì ë°ííë¯ë¡ ìí ê°ë¥ ë°ë³µìì
ëë¤.
모ë ë´ì¥ ë°ë³µìë this
를 ë°ííë [@@iterator]()
ë©ìë를 구ííë Iterator.prototype
ìì ììëì기 ë문ì ë´ì¥ ë°ë³µìë ìí ê°ë¥ì
ëë¤.
ê·¸ë¬ë ê°ë¥íë¤ë©´ iterable[Symbol.iterator]
ê° Set.prototype[@@iterator]()
ì²ë¼ íì ì²ìë¶í° ììíë ë³ê°ì ë°ë³µì를 ë°ííë ê²ì´ ì¢ìµëë¤.
ë¹ë기 ë°ë³µìì ë¹ë기 ìí ê°ë¥ íë¡í ì½ ì´ë¼ë ë¹ë기 ìíì ì¬ì©ëë ë ë¤ë¥¸ íë¡í ì½ ìì´ ììµëë¤. ìí ê°ë¥ê³¼ ë°ë³µì íë¡í ì½ê³¼ ë¹êµíì ë ë§¤ì° ì ì¬í ì¸í°íì´ì¤ë¥¼ ê°ì§ê³ ìê³ , ë°ë³µì ë©ìë í¸ì¶ì ê° ë°í ê°ì´ íë¡ë¯¸ì¤ë¡ ëíëë¤ë ì ë§ ë¤ë¦ ëë¤.
ê°ì²´ë ë¤ì ë©ìë를 구íí ë ë¹ë기 ìí ê°ë¥ íë¡í ì½ì 구íí©ëë¤.
[Symbol.asyncIterator]
ë¹ë기 ë°ë³µì íë¡í ì½ì ì¤ìíë ê°ì²´ë¥¼ ë°ííë ì¸ìê° ìë í¨ìì ëë¤.
ê°ì²´ë ë¤ì ë©ìë를 구íí ë ë¹ë기 ë°ë³µì íë¡í ì½ì 구íí©ëë¤.
next()
0ê° ëë 1ê°ì ì¸ì를 íì©íê³ íë¡ë¯¸ì¤ë¥¼ ë°ííë í¨ìì
ëë¤. íë¡ë¯¸ì¤ë IteratorResult
ì¸í°íì´ì¤ë¥¼ ì¤ìíë ê°ì²´ë¡ ì´íëë©°, ìì±ì ë기 ë°ë³µìì ëì¼í ì미 ì²´ê³ë¥¼ ê°ìµëë¤.
return(value)
Optional
0ê° ëë 1ê°ì ì¸ì를 íì©íê³ íë¡ë¯¸ì¤ë¥¼ ë°ííë í¨ìì
ëë¤. íë¡ë¯¸ì¤ë IteratorResult
ì¸í°íì´ì¤ë¥¼ ì¤ìíë ê°ì²´ë¡ ì´íëë©°, ìì±ì ë기 ë°ë³µìì ëì¼í ì미 ì²´ê³ë¥¼ ê°ìµëë¤.
throw(exception)
Optional
0ê° ëë 1ê°ì ì¸ì를 íì©íê³ íë¡ë¯¸ì¤ë¥¼ ë°ííë í¨ìì
ëë¤. íë¡ë¯¸ì¤ë IteratorResult
ì¸í°íì´ì¤ë¥¼ ì¤ìíë ê°ì²´ë¡ ì´íëë©°, ìì±ì ë기 ë°ë³µìì ëì¼í ì미 ì²´ê³ë¥¼ ê°ìµëë¤.
ì¸ì´ë ìí ê°ë¥ê³¼ ë°ë³µì를 ìì±íê±°ë ìë¹íë API를 ì§ì í©ëë¤.
ë´ì¥ ìí ê°ë¥String
, Array
, TypedArray
, Map
, Set
, ê·¸ë¦¬ê³ Intl.Segmenter.prototype.segment()
ìì ë°íë Segments
ë ê°ê°ì prototype
ê°ì²´ê° @@iterator
ë©ìë를 구íí기 ë문ì 모ë ë´ì¥ ìí ê°ë¥ì
ëë¤. ëí ì¸ì
ê°ì²´ì NodeList
ì ê°ì ì¼ë¶ DOM 컬ë ì
ì íë ìí ê°ë¥ì
ëë¤. ReadableStream
ì ì´ ë¬¸ì를 ìì±í ë¹ìì ì ì¼í ë´ì¥ ë¹ë기 ìí ê°ë¥ì
ëë¤.
ì ëë ì´í° í¨ìë ìí ê°ë¥ ë°ë³µìì¸ ì ëë ì´í° ê°ì²´ë¥¼ ë°íí©ëë¤. ë¹ë기 ì ëë ì´í° í¨ìë ë¹ë기 ìí ê°ë¥ ë°ë³µìì¸ ë¹ë기 ì ëë ì´í° ê°ì²´ë¥¼ ë°íí©ëë¤.
ë´ì¥ ìí ê°ë¥ìì ë°íë ë°ë³µìë ì¤ì ë¡ ëª¨ë ìì ì¸ê¸í [Symbol.iterator]() { return this; }
ë©ìë를 ì¬ì©íì¬ ìí ê°ë¥ ë°ë³µìë¡ ë§ëë ê³µíµ í´ëì¤(íì¬ ë
¸ì¶ëì´ìì§ ìì)를 ììë°ìµëë¤. ìì¼ë¡ ì´ë¬í ë´ì¥ ë°ë³µìë next()
ë©ìë ì¸ì ì¶ê°ì ì¼ë¡ ë°ë³µì íë¡í ì½ìì íìí ëì°ë¯¸ ë©ìë를 ê°ì§ê³ ìì ì ììµëë¤. ê·¸ëí½ ì½ìì ë¡ê·¸íì¬ ë°ë³µìì íë¡í íì
ì²´ì¸ì ê²ì¬í´ë³¼ ì ììµëë¤.
console.log([][Symbol.iterator]()); Array Iterator {} [[Prototype]]: Array Iterator ==> 모ë ë°°ì´ ë°ë³µìê° ê³µì íë íë¡í íì ì ëë¤. next: Æ next() Symbol(Symbol.toStringTag): "Array Iterator" [[Prototype]]: Object ==> 모ë ë´ì¥ ë°ë³µìê° ê³µì íë íë¡í íì ì ëë¤. Symbol(Symbol.iterator): Æ [Symbol.iterator]() [[Prototype]]: Object ==> Object.prototype ì ëë¤.ìí ê°ë¥ì íì©íë ë´ì¥ API
ìí ê°ë¥ì íì©íë ë§ì APIê° ììµëë¤. ëª ê°ì§ ìë ë¤ìê³¼ ê°ìµëë¤.
Map()
WeakMap()
Set()
WeakSet()
Promise.all()
Promise.allSettled()
Promise.race()
Promise.any()
Array.from()
const myObj = {};
new WeakSet(
(function* () {
yield {};
yield myObj;
yield {};
})(),
).has(myObj); // true
ìí ê°ë¥ì 기ëíë 구문
for...of
루í, ë°°ì´ ë° ë§¤ê°ë³ì ì ê°, yield*
, ê·¸ë¦¬ê³ ë°°ì´ êµ¬ì¡° ë¶í´ì ê°ì ì¼ë¶ ëª
ë ¹ë¬¸ê³¼ ííììë ìí ê°ë¥ì´ íìí©ëë¤.
for (const value of ["a", "b", "c"]) {
console.log(value);
}
// "a"
// "b"
// "c"
console.log([..."abc"]); // ["a", "b", "c"]
function* gen() {
yield* ["a", "b", "c"];
}
console.log(gen().next()); // { value: "a", done: false }
[a, b, c] = new Set(["a", "b", "c"]);
console.log(a); // "a"
ë´ì¥ êµ¬ë¬¸ì´ ë°ë³µì를 ìííê³ ë§ì§ë§ ê²°ê³¼ì done
ì´ false
(ì¦, ë°ë³µìê° ë ë§ì ê°ì ìì±í ì ìì)ì´ì§ë§ ë ì´ì ê°ì´ íìíì§ ìì ê²½ì° return
ë©ìëê° ìëê²½ì°, í´ë¹ ë©ìëê° í¸ì¶ë©ëë¤. ì를 ë¤ì´ break
ëë return
ì´ for...of
루íìì ë°ìíê±°ë 모ë ìë³ìê° ë°°ì´ êµ¬ì¡° ë¶í´ì ì´ë¯¸ ë°ì¸ë©ë ê²½ì°ì ì´ë¬í ìí©ì´ ë°ìí ì ììµëë¤.
const obj = {
[Symbol.iterator]() {
let i = 0;
return {
next() {
i++;
console.log("Returning", i);
if (i === 3) return { done: true, value: i };
return { done: false, value: i };
},
return() {
console.log("Closing");
return { done: true };
},
};
},
};
const [b] = obj;
// Returning 1
// Closing
const [a, b, c] = obj;
// Returning 1
// Returning 2
// Returning 3
// ì´ë¯¸ ëì ëë¬í기 ë문ì(ë§ì§ë§ í¸ì¶ì´ `done: true`를 ë°í)
// `return`ì´ í¸ì¶ëì§ ììµëë¤.
for (const b of obj) {
break;
}
// Returning 1
// Closing
ë¹ë기 ì ëë ì´í° í¨ì (ë기 ì ëë ì´í° í¨ìë ìë)ì for await...of
루íì yield*
ë ë¹ë기 ìí ê°ë¥ê³¼ ìí¸ ìì©íë ì ì¼í ë°©ë²ì
ëë¤. for...of
, ë°°ì´ ì ê° ë±ì ë기 ìí ê°ë¥ë ìë ë¹ë기 ìí ê°ë¥ê³¼ ì¬ì©íë©´(ì¦, [@@asyncIterator]()
ë ìì§ë§ [@@iterator]()
ë ìì) TypeError(x is not iterable.)ê° ë°ìí©ëë¤.
ìí ê°ë¥ì @@iterator
ë©ìëê° ë°ë³µì ê°ì²´ë¥¼ ë°ííì§ ìì¼ë©´ ì못 구ì±ë ìí ê°ë¥ì¼ë¡ ê°ì£¼ë©ëë¤.
ì´ë ê² ì¬ì©íë©´ ë°íì ì¤ë¥ ëë ë²ê·¸ê° ë°ìí ì ììµëë¤.
const nonWellFormedIterable = {};
nonWellFormedIterable[Symbol.iterator] = () => 1;
[...nonWellFormedIterable]; // TypeError: [Symbol.iterator]() returned a non-object value
ìì ì¬ì©ì ì ì ìí ê°ë¥
ì¬ë¬ë¶ì ë¤ìê³¼ ê°ì´ ì¬ë¬ë¶ë§ì ìí ê°ë¥ì ë§ë¤ ì ììµëë¤.
const myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
},
};
console.log([...myIterable]); // [1, 2, 3]
ê°ë¨í ë°ë³µì
ë°ë³µìë 본ë statefulì ëë¤. ìì ìì ê°ì´ ì ëë ì´í° í¨ìë¡ ì ìíì§ ìì¼ë©´, ì¬ë¬ë¶ì ìí를 í´ë¡ì ì 캡ìííê³ ì¶ì ê²ì ëë¤.
function makeIterator(array) {
let nextIndex = 0;
return {
next() {
return nextIndex < array.length
? {
value: array[nextIndex++],
done: false,
}
: {
done: true,
};
},
};
}
const it = makeIterator(["yo", "ya"]);
console.log(it.next().value); // 'yo'
console.log(it.next().value); // 'ya'
console.log(it.next().done); // true
무í ë°ë³µì
function idMaker() {
let index = 0;
return {
next() {
return {
value: index++,
done: false,
};
},
};
}
const it = idMaker();
console.log(it.next().value); // 0
console.log(it.next().value); // 1
console.log(it.next().value); // 2
// ...
ì ëë ì´í°ë¡ ë°ë³µì ì ìí기
function* makeSimpleGenerator(array) {
let nextIndex = 0;
while (nextIndex < array.length) {
yield array[nextIndex++];
}
}
const gen = makeSimpleGenerator(["yo", "ya"]);
console.log(gen.next().value); // 'yo'
console.log(gen.next().value); // 'ya'
console.log(gen.next().done); // true
function* idMaker() {
let index = 0;
while (true) {
yield index++;
}
}
const it = idMaker();
console.log(it.next().value); // 0
console.log(it.next().value); // 1
console.log(it.next().value); // 2
// ...
í´ëì¤ë¡ ë°ë³µì ì ìí기
ìí 캡ìíë íë¼ì´ë¹ ìì±ì¼ë¡ë ìíí ì ììµëë¤.
class SimpleClass {
#data;
constructor(data) {
this.#data = data;
}
[Symbol.iterator]() {
// ê° ë°ë³µìì ëí´ ì ìì¸ì ì¬ì©íì¸ì.
// ì´ë ê² íë©´ break ì¬ì© ëë ëì¼í ìí ê°ë¥ì ì¤ì²© 루íì ê°ì
// ì¬ìí ìí©ìì ìí ê°ë¥ì ëí ì¬ë¬ ë°ë³µì´ ìì í´ì§ëë¤.
let index = 0;
return {
// ì°¸ê³ : íì´í í¨ì를 ì¬ì©íë©´ `this`ê° `next()` ëì
// `[@@iterator]()` ì¤ íë를 ê°ë¦¬í¬ ì ììµëë¤.
next: () => {
if (index < this.#data.length) {
return { value: this.#data[index++], done: false };
} else {
return { done: true };
}
},
};
}
}
const simple = new SimpleClass([1, 2, 3, 4, 5]);
for (const val of simple) {
console.log(val); // 1 2 3 4 5
}
ë´ì¥ ìí ê°ë¥ ë®ì´ì°ê¸°
ì를 ë¤ì´ String
ì ë´ì¥ ìí ê°ë¥ ê°ì²´ì
ëë¤.
const someString = "hi";
console.log(typeof someString[Symbol.iterator]); // "function"
String
ì 기본 ë°ë³µìë ë¤ìê³¼ ê°ì´ 문ìì´ì ì½ë í¬ì¸í¸ë¥¼ íëì© ë°íí©ëë¤.
const iterator = someString[Symbol.iterator]();
console.log(`${iterator}`); // "[object String Iterator]"
console.log(iterator.next()); // { value: "h", done: false }
console.log(iterator.next()); // { value: "i", done: false }
console.log(iterator.next()); // { value: undefined, done: true }
ì¬ë¬ë¶ì ì¬ë¬ë¶ë§ì @@iterator
를 ì ê³µíì¬ ìí ëìì ì¬ì ìí ì ììµëë¤.
// auto-boxingì í¼í기 ìí´ ëª
ìì ì¼ë¡ String ê°ì²´ë¥¼ 구ì±í´ì¼ í©ëë¤.
const someString = new String("hi");
someString[Symbol.iterator] = function () {
return {
// ë¨ì¼ ìì(문ìì´ "bye")를 ë°ííë ë°ë³µì ê°ì²´
next() {
return this._first
? { value: "bye", done: (this._first = false) }
: { done: true };
},
_first: true,
};
};
@@iterator
ì¬ì ìê° ìí íë¡í ì½ì ì¬ì©íë ë´ì¥ ìì± ëìì ì´ë¤ ìí¥ì 미ì¹ëì§ íì¸í´ë³´ì¸ì.
console.log([...someString]); // ["bye"]
console.log(`${someString}`); // "hi"
ëª
ì¸ì ê°ì´ 보기
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4