javascript自定義一個迭代器

js中對象分爲可迭代和不可迭代 若是是可迭代哪它就會有一個[Symbol.iterator] 函數html

這個函數就是對象的迭代器函數,如用for of 若是遍歷的對象沒有這個迭代方法那麼就會報錯
web

for of 傳入的是可迭代對象,可是如何吧一個不可迭代的對象變爲可迭代的對象呢!數組

很簡單就是本身寫一個[Symbol.iterator] 函數。函數

代碼以下:ui

  

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        let obj = {
            a: 1,
            b: 2
        }

        obj[Symbol.iterator] = function () {
            //取到對象的每一個key值返回一個數組
            let keys = Object.keys(obj);
            //取到key值的長度
            let len = keys.length;
            //定義循環變量
            let n = 0;
            //返回對象 每次迭代會自動調用對象裏面的next方法
            return {
                next() {
                    //返回值有value和done
                    //value能自定義
                    //done爲true跳出循環
                    return n < len ? {
                        value: { k: keys[n], v: obj[keys[n++]] },
                        done: false
                    } : {
                            done: true
                        }
                }
            }
        }
        //循環 
        //for of 只能遍歷可迭代對象
        //因此本身寫了個迭代器 詳情請查閱web迭代協議
        //返回的是個對象的key和value
        for (let { k, v } of obj) {
            console.log(k, v);
        }
    </script>
</body>

</html>

 

 使用生成器迭代也就是Generator函數代碼以下:spa

let obj = {
            a: 1,
            b: 2
        }
        obj[Symbol.iterator] = function *(){
           let keys = Object.keys(obj);
           //取到key值的長度
           let len = keys.length;
           //定義循環變量
            let n = 0;
            //條件判斷
            while(n < len) {
                yield {k:keys[n],v: obj[keys[n++]]};
            }
        }
    //返回的是個對象的key和value
        for (let {k,v} of obj) {
            console.log(k,v);
        }

註釋很完整就很少講了,code

2次輸出結果相同htm

輸出以下:對象

  

 

  但願可以幫助到大家!!blog

相關文章
相關標籤/搜索