for...of與Symbol.iterator之間的關係(es6)

我先說明一下,for...of在es6之前是沒有的,之前都是採用for,forEach,for...in 來循環

而for...of的出現,主要取決於Map,Set等新數據結構的出現,使得官方打算推出一種統一的訪問機制。

而想要使用for...of,必須部署Symbol.iterator接口,這是官方的定義。

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函數的 arguments 對象
  • NodeList 對象

本身就有隱式的Symbol.iterator接口,所以無需部署

而像obj對象,我們可以自己靈活的定義Symbol.iterator接口

let obj = {
    arr: [1, 2, 3],
    [Symbol.iterator]: function () {
        var self = this
        var i = 0
        return {
            next: function () {
                var done = i >= self.arr.length
                return {
                    value: !done ? self.arr[i++] : undefined,
                    done: done //done默認爲false 爲false說明有下一個
                }
            }
        }
    }
}
for (let key of obj) {
    console.log(key) //1 2 3
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章