Iterator & for-of | Symbol | [Symbol.iterator()]
- -
๋ชจ๋ ํฌ์คํ ์ ์ธํ๋ฐ ECMAScript6: ๋น ๋ฅด๊ฒ ๋ฐฐ์ฐ๋ ES6 ์คํฌ๊ณผ ๋น๋๊ธฐ ํ๋ก๊ทธ๋จ ์ ๋ด์ฉ์ ๋ด๊ณ ์์ผ๋ฉฐ
์ถ์ฒ๋ ์๋์ ์ฃผ์๋ก "๊นํํ"๋์ ์๋ฃ์ ๋๋ค.
์์ ์ ์ธ ์๋๊ฐ ์๋ ๊ณต๋ถํ ๊ฒ์ ์ ๋ฆฌํด๋๋ ๋ชฉ์ ์ผ๋ก ํฌ์คํ ํ ๊ฒ์ ๋๋ค.
www.inflearn.com/course/es6-ecmascript-6
1. Iterator & for-of
# ์ดํฐ๋ ์ดํฐ์ for-of
๊ธฐ์กด์ ๋ฌธ๋ฒ์์๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ํํ ๋ iterator์ ์ฌ์ฉํ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์๋ for, for each, for -in ๋ฅผ ์ฌ์ฉํ์ง๋ง, forEach๋ ๋ธ๋ ์ดํฌ๋ก ๋ฃจํ๋ฅผ ์ค๋จํ ์ ์์๊ณ , for -in์ ๊ฐ์ฒด์ ์์ฑ๋ค์ ์ํํ ๋ ์ฌ์ฉํ์๋ค.
ES6์์๋ ๋ค์ํ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ก ์๋ก์ด ์ข ๋ฅ์ ๋ฃจํ ๋ฌธ๋ฒ์ ์ถ๊ฐํ์๋๋ฐ, ์ด๊ฒ์ด ๋ฐ๋ก iterator ๊ณผ for -of์ด๋ค.
<script>
const myArray = [10,20,30];
for(let value of myArray){
console.log(value);
}
</script>
๋ค์๊ณผ ๊ฐ์ด ์ดํฐ๋ ์ดํฐ๋ฅผ ์ ์ํ๊ณ for-ofํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํ๊ฐ ๊ฐ๋ฅํ๋ค.
# iterable
for-of ๊ตฌ๋ฌธ์ ์์ ๋ณด์๋ ๋ฐฐ์ด ๋ฟ๋ง ์๋๋ผ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ผ๋ฉด ๋ชจ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ดํฐ๋ฌ๋ธ ์ด๋ ์ํ ๊ฐ๋ฅํ ์ด๋ผ๋ ๋ป์ด๋ค.(์๋ฏธ ๊ทธ๋๋ก)
์ดํฐ๋ ์ดํฐ๋ ๊ฒฐ๊ตญ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๋งํ๋ ๊ฒ์ด๋ค.์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ ์ํ๋ฅผ ์ํด Symbol.iterator ์์ฑ์ ๊ฐ์ง๋ค.
์ด ์์ฑ์ ์์๋ณด๊ธฐ ์ ์ simbol์ ๋ํด ์์๋ณด๋๋ก ํ์
2. symbol
๊ฐ์ฒด์ ์ด๋ ํ ๊ฒ๊ณผ๋ ๋ค๋ฅธ ์ ๋ํฌํ ์์ฑ์ ๋ง๋ค๊ธฐ ์ํ ํ์
<script>
let name = Symbol("kim");
console.log(typeof name);
</script>
์ฌ๋ณผ์ ์์ ๊ฐ์ด ์์ฑํ๋ฉฐ, ๋จํญ์ฐ์ฐ์ typeof์ ๊ฒฐ๊ณผ๋ก ๊ธฐ๋ณธํ์ธ "Symbol"์ ๋ฐํํ๋ค.
typeof๊ฐ ๋ฐํํ๋ ํ์
- Undefined
- Boolean
- String
- Number
- Object
- Function
- Symbol
object์ function์ ์ ์ธํ๋ฉด ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธํ์ด๋ค.๊ธฐ๋ณธํ์๋ null๋ ์์ง๋ง, typeof null์ object๋ก ์ถ๋ ฅ๋๋ค.
<script>
const myObject = {
symbol1: [Symbol("My Symbol")],
symbol2: [Symbol("My Symbol")],
};
console.log(myObject.symbol1 == myObject.symbol2);
</script>
๊ฒฐ๊ณผ๋ false์ด๋ค.
Symbol์ ๊ฐ์ฅ ํฐ ํน์ง์ ๊ณ ์ ํ ๊ฒ์ด๋ค. myObject ๊ฐ์ฒด๋ symbol1,2 ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ฐ๊ฐ value๋ด๋ถ์ "My Symbol"์ด๋ผ๋ ๊ฐ์ description์ ๊ฐ๊ณ ์์ง๋ง, Symbol์ ๊ณ ์ ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ false๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ค.
๐๐ป Symbol ์์ธํ ์์๋ณด๊ธฐ
developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Symbol
์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์
<script>
const myObject = {};
myObject.a = "apple";
myObject["b"] = "book";
let c = Symbol("c");
myObject[c] = "cat"
myObject[Symbol("d")] = "dog";
for(let key in Object){
console.log("key in : " + key);
}
console.log("Object.keys(myObject): " + Object.keys(myObject));
</script>
๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฝ์ ํ ๋ 3๋ฒ,4๋ฒ(script์ ์ธํ๊ณ ) ๋ผ์ธ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง๋ง 7๋ฒ,8๋ฒ ๋ผ์ธ์ ์ฌ๋ณผ์ ๋๋ธ ์ฟผํ ์ด์ ์ผ๋ก ๊ฐ์ธ์ง ์๋๋ค.
์๋ฐ ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด ๋ฃจํ์ธ for-in์ด๋ Object.keys๋ฉ์๋๋ ์ฌ๋ณผ ํค๋ฅผ ๊ฑด๋๋ฐ๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅ๋์ง ์๋๋ค.
์ฝ๋ ์๋์ ์๋ก์ด api๋ฅผ ์ถ๊ฐํด๋ณด์
<script>
const myObject = {};
myObject.a = "apple";
myObject["b"] = "book";
let c = Symbol("c");
myObject[c] = "cat"
myObject[Symbol("d")] = "dog";
for(let key in Object){
console.log("key in : " + key);
}
console.log("Object.keys(myObject): " + Object.keys(myObject));
console.log("myObject[c] : " + myObject[c]);
console.log(Object.getOwnPropertySymbols(myObject));
</script>
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ก์ด api "Object.getOwnpropertySymbols()" ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ์์ ์กด์ฌํ๋ ์ฌ๋ณผ ํค ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ค.
์ด๋ ๊ฒ ์ฌ๋ณผ ๊ฐ์ฒด๋ฅผ ์ ์ํด์ ์ฌ์ฉํ ์๋ ์์ง๋ง, ์์ฒด์ ์ธ ํ์ค์ผ๋ก ์ ์๋์ด ์๋ ์ฌ๋ณผ์ด ๋ช ๊ฐ ์๋๋ฐ ๊ทธ ์ค ํ๋๊ฐ Symbol.iterator์ด๋ค.
๐๐ป ๊ฐ ์์ฑ ์ดํด๋ณด๊ธฐ
pks2974.medium.com/javascript์-์ฌ๋ณผ-symbol-bbdf3251aa28
์ด ์ฌ๋ณผ์ ์์ฑ์ผ๋ก ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ด ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ ํ๋ค ๋ผ๊ณ ์ ์๋ ๊ฒ์ด๋ค. ๊ฒฐ๊ตญ ์ด ๊ฐ์ฒด๋ for-of ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
3. simbol.iterator()
# for-of์ ๋ด๋ถ๋์
์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๋ ์์ ์ดํด๋ณธ Symbol.iterator ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
for-of ๋ฃจํ๋ ๋ฐ๋ก ์ด symbol.iterator ๋ฉ์๋ ํธ์ถ๋ก ์์์ด ๋๊ณ , ๊ทธ ๋ฐํ ๊ฐ์ผ๋ก ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๊ฐ ๋ฆฌํด๋๋ค.
# iterator
- next()๋ฉ์๋์ value, done์ ์์ฑ์ผ๋ก ๊ฐ์ง๋ค.
- next ๋ฉ์๋๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๋ฐ๋ณตํ๋ฉด์ ์ปฌ๋ ์ ์ ๊ฐ์ฒด๋ค์ ์ํํ๋ค๋ ๊ฒ์ด๋ค.
<script>
const set = new Set([10,20]);
const myIter = set.entries();
console.log(myIter.next());
console.log(myIter.next());
console.log(myIter.next());
</script>
์ ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
//set์ ๋ํ ์ค๋ช ์ ๋ค์ ๊ฐ์ข์์ ๋ค๋ฃจ๊ฒ ๋ค.
myIter๋ผ๋ ์ดํฐ๋ ์ดํฐ๊ฐ ์ค๋น๋์ด์๋ค. ์ดํฐ๋ ์ดํฐ๊ฐ ๊ฐ์ง next๋ฉ์๋ ํธ์ถ์ ๋ฐํ๊ฐ์ผ๋ก value์ done์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ๋ฆฌํด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Value๋ ํ์ฌ ์ดํฐ๋ ์ดํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๊ฐ์ด๊ณ , done์ ์ดํฐ๋ ์ดํฐ๊ฐ ๋๊น์ง ๋๋ฌํ๋์ง ์ฌ๋ถ๋ฅผ true, false๋ก ์๋ ค์ฃผ๋ ๊ฒ์ด๋ค.
๊ฒฐ๊ณผ์ ๋งจ ๋ง์ง๋ง๊ณผ ๊ฐ์ด ๋๊น์ง ๊ฐ๊ฒ๋๋ฉด value๋ undefined, done์ true๊ฐ ์ถ๋ ฅ๋๋ค.
# ์ ๋ฆฌํ๊ธฐ
- for-of ๊ตฌ๋ฌธ์ด ์๋ํ๋ ๋ฐฉ์์ ๋ค๋ฅธ ์ธ์ด๋ค์ for-of ๊ตฌ๋ฌธ๋ค ์ฒ๋ผ ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ๋ฉ์๋ค์ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
- ES6์์ ์๋ก ์ถ๊ฐ๋ for-of ๊ตฌ๋ฌธ์ ๋ชจ๋ iterable ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
'Languages > Java Script' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Generator & yield | yield* | return (0) | 2021.02.15 |
---|---|
Rest Parameter | Map | Maplterator | Filtering & Set | Set (0) | 2021.02.15 |
Arrow Function & this | IIFE | Default Parameter (0) | 2021.02.15 |
Template Literals | Destructuring | class (0) | 2021.02.15 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค