2017-07-30 102 views
0

在筆記它指出:理解迭代器協議

迭代協議允許JavaScript對象定義或定製 他們的迭代行爲,比如什麼值在 for..of掛繞構造。

當我已經可以使用Object.degineProperty來使某些東西可枚舉時,我看不出有什麼好處。

function withValue(value) { 
     var d = withValue.d || (
      withValue.d = { 
       enumerable: false, 
       writeable: false, 
       configuration: false, 
       value: null 
      } 
    ) 
    // other code; 
    } 

這些協議有什麼好處?如果這只是一些新的語法來安撫循環的新內容,除了簡單地檢查長度並查看其是否耗盡了「列表」中的項目之外,還有什麼好處。

+0

屬性的可枚舉性與迭代器完全無關?最重要的是,屬性沒有**順序**,在其中進行迭代。 – Bergi

+0

迭代器比「列表」更通用。它甚至不需要有一個長度 - 如果你想要它可以是無限的! – Bergi

+0

「*在說明中註明*」 - 什麼?哪裏?哪些筆記? – Bergi

回答

1

將Iterable看作接口。你可以放心的實現包含一個Symbol.iterator屬性,它實現了一個next()方法。如果你自己實現,你可以產生你想在運行時迭代的值。舉一個簡單的例子,產生一個列表,並決定以後有多少(或,或任何標準),你想遍歷:

function List (...args) { 
    this.getOnly = function (limit) (
     const effectiveLimit = Math.min(args.length, limit + 1); 
     const iterable = { 
      [Symbol.iterator]() { 
       let count = 0; 
       const iterator = { 
        next() { 
         if (count < effectiveLimit) { 
          return { value: args[count++] }; 
         } else { 
          return { done: true }; 
         } 
        } 
       }; 
       return iterator; 
      } 
     } 
     return iterable; 
    }; 
} 

const list = List(0, 1, 2, 3, 4); 
for (const x of list.getOnly(3)) { 
    console.log(x); 
} 
// returns 0, 1, 2 

如果使用發電機的功能,它實現了Iterable接口,同變得非常簡單:你可以用Iterables做什麼

function List (...args) { 
    this.getOnly = function* (limit) { 
     const effectiveLimit = Math.min(args.length, limit + 1); 
     for (let count = 0; count < effectiveLimit; count++) { 
      yield args[count]; 
     } 
    } 
} 

更多的例子列出here

+0

'count'應該在迭代器中聲明 – Bergi