内置迭代:属性长度和访问器含义

时间:2017-05-18 21:42:32

标签: javascript ecmascript-6 accessor iterable

所有具有属性.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违反了这条规则。

3 个答案:

答案 0 :(得分:2)

我反过来说:

  • 所有可索引的集合都有.length属性
  • 所有可索引的集合都是可迭代的(即使用[Symbol.iterator]方法) 1

规范中没有官方设计声明可以保证这一点(特别是作为未来收藏的指南),但我们可以像在您的问题中一样简单地将所有标准内置列表制成表格。

1:请注意String已经为预期规则提供了一个例外,即迭代值将与索引元素相对应 - 它iterates代码点而不是字符 < / p>

答案 1 :(得分:0)

并非JavaScript中的所有产品都具有属性长度

数组(或序列)具有属性.length来计算条目数。而地图和集合则使用.size方法。

基本上.length用于序列(可索引的数据结构),.size用于通常无序的集合(例如地图或集合)

iterables(例如数组)不需要.next()方法,而且很少有方法;相反,它们有一个特殊的方法Symbol.iterator,它将返回一个迭代器(即一个带有.next()方法的对象)。 (编辑@ frxstrem

请参阅Iteration Protocol

上的MDN文档

答案 2 :(得分:0)

如果它是一个数组,请使用[ $10771 $3802 $4807 $5371 $4255 $4301 $7692 $5962 $6501 $10576 $6910 $11630] ,如果它是一个集合,请使用length