true
or false
, ์ถ๋ ฅ๊ฒฐ๊ณผ๋ฌผ์ ์์ฑํด์ฃผ์ธ์.
ES6์์๋ ์ํ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ์ปฌ๋ ์
์ ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ์ค์ํ๋ ์ดํฐ๋ฌ๋ธ๋ก ํต์ผํ์ฌ for...in๋ฌธ,์คํ๋ ๋ ๋ฌธ๋ฒ,
๊ฐ์ฒด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น์ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ผ์ํ ํ๋ค.
- true or false // (1)
const obj = { 0 : 1 , 1 : 2 , length : 2 } ;
const iter = obj [ Symbol . iterator ] ( ) ;
console . log ( iter . next ( ) ) ; // (2)
console . log ( iter . next ( ) ) ; // (3)
console . log ( iter . next ( ) ) ; // (4)
(1) false
for...in -> for...of
๊ฐ์ฒด -> ๋ฐฐ์ด
(2~4) : TypeError: obj[Symbol.iterator] is not a function
์ผ๋ฐ ๊ฐ์ฒด์๋ Symbol.iterator๋ฉ์๋๋ฅผ ๊ตฌํํ๊ฑฐ๋ ์์ ๋ฐ์ง ์๋๋ค.
์ดํฐ๋ฌ๋ธ,์ดํฐ๋ ์ดํฐ,์ดํฐ๋ฌ๋ธ ์ด๋ฉด์ ์ดํฐ๋ ์ดํฐ๋ฅผ ํ๋จํด์ฃผ์ธ์.
const f1 = ( first , max ) => {
let num = first ;
return {
[ Symbol . iterator ] ( ) {
return {
next ( ) {
num += 1 ;
return { value : num , done : num > max } ;
} ,
} ;
} ,
} ;
} ;
const test = f1 ( 0 , 10 ) ; // (1)
const test1 = test [ Symbol . iterator ] ( ) ; // (2)
const f2 = ( first , max ) => {
let num = first ;
return {
[ Symbol . iterator ] ( ) {
return this ;
} ,
next ( ) {
num += 1 ;
return { vaule : num , done : num > max } ;
} ,
} ;
} ;
const test3 = f2 ( 0 , 10 ) ; // (3)
(1): ์ดํฐ๋ฌ๋ธ
-> Symbol.iteraor๋ฅผ ํค๋ก๊ฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด๋ฅผ ํธ์ถํ์๋ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๊ฐ๊ธฐ๋๋ฌธ์ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ด๋, next๋ผ๋ ์ด๋ฆ์ ๋ฉ์๋(ํธ์ถํ์๋ {value : _ , done : _ }๊ฐ์ฒด๋ฅผ ๋ฆฌํด)๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธ.
(2): ์ดํฐ๋ ์ดํฐ
-> next๋ผ๋ ์ด๋ฆ์ ๋ฉ์๋(ํธ์ถํ์๋ {value : _ , done : _ }๊ฐ์ฒด๋ฅผ ๋ฆฌํด)๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์.
(3): ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ์ดํฐ๋ ์ดํฐ
-> ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ Symbol.iterator๋ฅผํค๋กํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๊ณ (์ดํฐ๋ฌ๋ธ) ๋์์ {value: _, done: _ }๋ฅผ ๋ฆฌํดํ๋ next๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ๋๋ฌธ.(์ดํฐ๋ ์ดํฐ)
์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ํ์์ฑ์ ๋ํด ์ค๋ช
ํด๋ณด์ธ์.
๊ต์ฌ 621p
์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ๋ค์ํ ๋ฐ์ดํฐ ๊ณต๊ธ์๊ฐ ํ๋์ ์ํ ๋ฐฉ์์ ๊ฐ๋๋ก ๊ท์ ํ์ฌ
๋ฐ์ดํฐ ์๋น์๊ฐ ํจ์จ์ ์ผ๋ก ๋ค์ํ ๋ฐ์ดํฐ ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก
๋ฐ์ดํฐ ์๋น์์ ๋ฐ์ดํฐ ๊ณต๊ธ์๋ฅผ ์ฐ๊ฒฐํ๋ ์ธํฐํ์ด์ค ์ฐ๊ฒฐ์ ํ๋ค.
๋ค์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์์ค
const arrayLike = {
0 : 1 ,
1 : 2 ,
2 : 3 ,
length : 3
} ;
console . log ( Symbol . iterator in arrayLike ) ; //(1)
for ( const item of obj ) { // (2)
console . log ( item ) ;
}
(1) false
์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๊ฐ ์๋ค.
(2) TypeError
์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ for๋ฌธ์ ๊ฐ๋ฅํ์ง๋ง, ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ for ... of์ ๋ถ๊ฐ๋ฅํ๋ค. ๋ํ ์คํ๋ ๋ ๋ฌธ๋ฒ๊ณผ ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น์ ๋์์ด ์๋๋ค.
5-1. ๋ค์ ์ฝ๋๋ฅผ ๋ฌดํ ์ดํฐ๋ฌ๋ธ ์์ฑ ํจ์๋ก ๋ฐ๊พธ์์ค.
const addOne = function ( ) {
let cur = 0 ;
const max = 10 ;
return {
[ Symbol . iterator ] ( ) { return this ; } ,
next ( ) {
cur = cur + 1 ;
return { value : cur , done : cur >= max } ;
}
} ;
} ;
for ( const num of addOne ( ) ) {
if ( num > 100 ) break ;
console . log ( num ) ;
}
const addOne = function ( ) {
let cur = 0 ;
return {
[ Symbol . iterator ] ( ) { return this ; } ,
next ( ) {
cur = cur + 1 ;
return { value : cur } ; //done ๊ฐ์ ์์ ์ค๋ค
}
} ;
} ;
for ( const num of addOne ( ) ) {
if ( num > 100 ) break ;
console . log ( num ) ;
}
// ๋ฌดํ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ ๋๋๋ ์กฐ๊ฑด ์ด ์๊ธฐ ๋๋ฌธ์ done ๊ฐ์ ์์ ์ฃผ๋ฉด ๋๋ค.
5-2. ๋ฌดํ ์ดํฐ๋ฌ๋ธ์ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๋๊ฐ? ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ๊ทธ ์ด์ ๋ ๋ฌด์์ธ์ง ์ฐ์์ค.
๋นํธ์ธ ์ดํฐ๋ฌ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ธํ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋ฐ์ดํฐ ์๋น์์ธ for ... of ๋ฌธ์ด๋ ๋ฐฐ์ด ๋์คํธ๋ญ์๋ง ํ ๋น ๋ฑ์ด ์คํ๋๊ธฐ ์ด์ ๊น์ง
๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ง๋ ์๋๋ค. for ... of์ ๊ฒฝ์ฐ ์ดํฐ๋ฌ๋ธ์ ์ํํ ๋
๋ด๋ถ์์ ์ดํฐ๋ ์ดํฐ์ next ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ฐ ์ด๋ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋ค.
์ด์ฒ๋ผ ์ง์ฐํ๊ฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ผ์ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ์ง ์์ผ๋ฉฐ
๋์์ ๋ฌดํ๋ ํํํ ์ ์๋ค.
์ดํฐ๋ฌ๋ธ
๊ณผ ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด
์ ํน์ฑ๊ณผ ์ฐจ์ด์ ์ ์์ฑํ์์ค.
์ดํฐ๋ฌ๋ธ
: Symbol.iterator๋ฅผ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํ๊ฑฐ๋ ํ๋กํ ํ์
์ฒด์ธ์ ํตํด ์์๋ฐ์ ๊ฐ์ฒด์ด๋ค. ๋ฐ๋ผ์ for...of๋ฌธ์ผ๋ก ์ํ ํ ์ ์๋ค. ํด๋น ๊ฐ์ฒด์ ์์ฑ ๋๋ ํ๋กํ ํ์
์์ฑ์ `Symbol(Symbol.iterator)` ์์ฑ์ด ์๋ค.
์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด
: ์ธ๋ฑ์ค๋ก ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ ์ ์๊ณ , length ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด์ด๋ค. ํ์ง๋ง Symbol.iterator ๋ฉ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์ for...of๋ฌธ์ผ๋ก ์ํ ํ ์ ์๋ค.
๋ค์ ๋ณด๊ธฐ์ ์ดํฐ๋ฌ๋ธ
์ธ์ง ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด
์ธ์ง ๋๋ค
์ธ์ง ํ๋จํ์์ค.
(1) []
(2) new String("123")
(3) new Number(123)
(4) document.querySelector('li')
(5) document.querySelectorAll('li')
(6) {}
(7) { length: 0 }
(8) null
(9) let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
(1) []
: ์ดํฐ๋ฌ๋ธO / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดO
(2) new String("123")
: ์ดํฐ๋ฌ๋ธO / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดO
(3) new Number(123)
: ์ดํฐ๋ฌ๋ธX / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดX
(4) document.querySelector('li')
: ์ดํฐ๋ฌ๋ธX / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดX
(5) document.querySelectorAll('li')
: ์ดํฐ๋ฌ๋ธO / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดO
(6) {}
: ์ดํฐ๋ฌ๋ธX / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดX
(7) { length: 0 }
: ์ดํฐ๋ฌ๋ธX / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดO
(8) null
: ์ดํฐ๋ฌ๋ธX / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดX
(9) range
: ์ดํฐ๋ฌ๋ธO / ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒดX