【问题标题】:Built-in iterables: property length and accessor implications内置可迭代对象:属性长度和访问器含义
【发布时间】:2017-10-18 21:16:00
【问题描述】:

是否所有具有 .length 属性的 javascript 内置迭代器都能够通过 [<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

我不知道是否有其他内置的迭代器违反了这个规则。

【问题讨论】:

  • NodeListHTMLCollection 不是 JavaScript 内置函数,它们是 DOM 对象。
  • 好的,感谢您的澄清!

标签: javascript ecmascript-6 accessor iterable


【解决方案1】:

我会反过来说:

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

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

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

【讨论】:

  • 谢谢@Bergi!真的很有用。
【解决方案2】:

并非所有 JavaScript 中的可迭代对象都有长度属性

数组(或序列)具有属性.length 来计算条目数。 Maps 和 Sets 使用 .size 方法。

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

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

请参阅 Iteration Protocol 上的 MDN 文档

【讨论】:

  • 您关于迭代协议的第三段不正确:可迭代对象(例如数组)不需要.next 方法,而且很少有人这样做;相反,他们有一个特殊的方法[Symbol.iterator](),它将返回一个迭代器(即一个具有.next()方法的对象)。
  • 第一段也是错误的。 Map and Set 具有属性size,而不是方法size()。这并没有回答我的问题,抱歉,谢谢!
  • 感谢 @xgbuils 发现这一点(我在 Java 模式下哈哈),现在已经更新了 :)
【解决方案3】:

如果是数组,使用length,如果是集合,使用size

【讨论】:

  • 哈哈,简明扼要!您也可以将括号表示法用于可索引结构
猜你喜欢
  • 2019-07-15
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2023-03-24
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多