2017-05-18 59 views
1

是否所有的屬性爲.length的javascript buit-in iterables都可以通過[<numeric index>]訪問迭代的元素,反之亦然?內置的迭代器:屬性長度和訪問器影響

Array -> has `.length` & has `[]` accessor 
String -> has `.length` & has `[]` accessor 
TypedArray -> has `.length` & has `[]` accessor 
Set -> does not have `.length` & does not have `[]` accessor 
Map -> does not have `.length` & does not have `[]` accessor 
NodeList -> has `.length` & has `[]` accessor 
HTMLCollection -> has `.length` & has `[]` accessor 

我不知道是否有其他內置的iterables打破了這個規則。

+2

'NodeList'和'HTMLCollection'沒有JavaScript內建,它們是DOM對象。 – Bergi

+0

好的,謝謝澄清! – xgbuils

回答

0

不是在JavaScript中所有itterables具有屬性長度

陣列(或序列)具有這樣的性質.length計數條目的數量。地圖和集合使用.size方法。

基本上.length用於序列(即是可轉位的數據結構),和.size是對於通常無序集合(例如地圖或套)

iterables(如陣列)不需要具有.next()方法,而且他們中很少有人做;相反,它們有一個特殊的方法Symbol.iterator,它將返回一個迭代器(即帶有.next()方法的對象)。 (編輯信貸@frxstrem

查看Iteration Protocol

+1

關於迭代協議的第三段是不正確的:迭代器(如數組)不需要'.next'方法,而且它們中的很少一部分都可以;相反,他們有一個特殊的方法['[Symbol.iterator]()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator) *返回*一個迭代器(即帶有'.next()'方法的對象)。 – Frxstrem

+0

第一段也是錯誤的。 Map和Set有屬性'size',而不是'size()'方法。這並不能回答我的問題,對不起,謝謝! – xgbuils

+0

感謝@ xgbuils發現(我是在Java模式lol),它已被更新:) – Lissy

2

的MDN文檔,我想說明這一輪的另一種方式:

  • 所有可轉位集合確實有.length財產
  • 所有可索引集合是可迭代的(即,具有[Symbol.iterator]方法)

規範中沒有官方設計聲明保證這一點(特別是作爲未來收藏的指導原則),但我們可以簡單地通過這種方式製作所有標準構建語句,就像您在問題中所做的一樣。

1:注意String已經提供的例外預期規則的迭代值將對應於索引元素 - 它iterates碼點,而不是字符

+0

謝謝@Bergi!它非常有用。 – xgbuils

0

如果它是一個數組,使用length,如果它是一個集合,使用size

+0

哈哈,簡潔明瞭!您也可以對可索引結構使用括號表示法 – Lissy

相關問題