HTMLCollections 可以用 for...of (Symbol.iterator) 进行迭代吗?

2024-04-15

DOM4 使NodeList https://www.w3.org/TR/dom/#interface-nodelist可迭代:

interface NodeList {
  getter Node https://www.w3.org/TR/dom/#node? item https://www.w3.org/TR/dom/#dom-nodelist-item(unsigned long index);
  readonly attribute unsigned long length https://www.w3.org/TR/dom/#dom-nodelist-length;
  iterable<Node https://www.w3.org/TR/dom/#node>;
};

根据WebIDL https://heycam.github.io/webidl/#idl-iterable, 这意味着

实现声明为可迭代的接口的对象 支持迭代以获得一系列值。

注意:在 ECMAScript 语言绑定中,接口是 iterable 将具有“entries”、“forEach”、“keys”、“values” 和@@迭代器 https://tc39.github.io/ecma262/#sec-well-known-symbols其上的属性接口原型对象 https://heycam.github.io/webidl/#dfn-interface-prototype-object.

因此,以下情况是可能的:

for (var el of document.querySelectorAll(selector)) ...

我注意到 HTMLCollections 似乎同样适用,无论是在 Firefox 还是 Chrome 上:

for (var el of document.getElementsByTagName(tag)) ...

事实上,我得到

HTMLCollection.prototype[Symbol.iterator] === [][Symbol.iterator]; // true

然而,HTML集合 https://www.w3.org/TR/dom/#interface-htmlcollection未定义为可迭代:

interface HTMLCollection {
  readonly attribute unsigned long length https://www.w3.org/TR/dom/#dom-htmlcollection-length;
  getter Element https://www.w3.org/TR/dom/#element? item https://www.w3.org/TR/dom/#dom-htmlcollection-item(unsigned long index);
  getter Element https://www.w3.org/TR/dom/#element? namedItem https://www.w3.org/TR/dom/#dom-htmlcollection-nameditem(DOMString name);
};

我还检查了WHATWG DOM 规范 https://dom.spec.whatwg.org/#interface-htmlcollection而且它也不是可迭代的。

那么,这种行为是否规范呢?是HTMLCollection应该有一个@@iterator在原型中?


我找到了,里面有解释WebIDL https://heycam.github.io/webidl/#es-iterator:

If the 界面 https://heycam.github.io/webidl/#dfn-interface具有以下任一情况:

  • an 可迭代声明 https://heycam.github.io/webidl/#dfn-iterable-declaration
  • an 索引属性获取器 https://heycam.github.io/webidl/#dfn-indexed-property-getter and an 整数类型 https://heycam.github.io/webidl/#dfn-integer-type 属性 https://heycam.github.io/webidl/#dfn-attribute命名为“长度”
  • a 地图式声明 https://heycam.github.io/webidl/#dfn-maplike-declaration
  • a 类似集合的声明 https://heycam.github.io/webidl/#dfn-setlike-declaration

那么必须存在一个名为@@迭代器 https://tc39.github.io/ecma262/#sec-well-known-symbols象征, 具有属性 { [[可写]]:true,[[可枚举]]:false, [[可配置]]:true} 其值为 a功能 目的 https://heycam.github.io/webidl/#dfn-function-object. [...]

如果接口定义了一个索引属性获取器 https://heycam.github.io/webidl/#dfn-indexed-property-getter,那么Function对象是%ArrayProto_values% https://tc39.github.io/ecma262/#sec-well-known-intrinsic-objects.

在本例中,HTMLCollections 有一个索引属性 getter:

getter Element https://www.w3.org/TR/dom/#element? item https://www.w3.org/TR/dom/#dom-htmlcollection-item(unsigned long index);

和一个名为“length”的整数类型属性:

readonly attribute unsigned long length https://www.w3.org/TR/dom/#dom-htmlcollection-length;

因此,是的,它应该有效。事实上,它也适用于 NodeList,即使它们没有声明为可迭代的,但这样它们就没有entries, forEach, keys and values特性。正如@lonesomeday提到的,HTMLCollection很可能没有被定义为可迭代的,因为添加这些方法不会向后兼容,因为事实上namedItemgetter 接受任意字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTMLCollections 可以用 for...of (Symbol.iterator) 进行迭代吗? 的相关文章

  • 如何理解 Angular JS 中的控制台错误消息?有什么工具吗?

    我是 Angular JS 的新手 我的第一个问题是如何理解 Angular JS 中控制台的错误消息 我编写了这段用于匹配密码的代码片段 它在控制台上抛出错误 但它工作正常 它是有线的 我无法从这些控制台消息中理解任何内容 谁能指出我为什
  • 如何使用键盘和鼠标控制相机 - Three.js

    我在 WEB GL 中有一个带有 Three js 的 3D 环境 并且我曾经使用 Orbitcontrols js http codepen io nireno pen cAoGI http codepen io nireno pen c
  • 如何通过 HTML 按钮播放声音

    我目前通过网站播放音乐的方法是通过 HTML 音频标签 不过我希望能够通过 HTML 按钮来播放它 该按钮应该能够在播放和停止之间切换音乐 我在 JSFiddle 创建了一个示例 但不知道如何实现它 有人可以告诉我如何使用我的 JSFidd
  • 何时不使用承诺[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在阅读了数十篇关于 es6 Promise 有多伟大以及为什么我们应该实现它们的文章之后 我有这样的感觉 ALL我的 不平凡的 JavaScri
  • 创建 Cookie 时需要帮助

    我有一个名为yes和另一个名叫no
  • 在 MVC Razor 中的 C# 和 Javascript 之间共享常量

    我想在服务器上的 C 和客户端上的 Javascript 中都使用字符串常量 我将常量封装在 C 类中 namespace MyModel public static class Constants public const string
  • 如何记录返回的事件发射器

    如何记录所发出的事件stream返回于MyFunc 与 JSDoc MyFunc description param Object opts description return Stream description function My
  • 如何使用 jQuery 向表中添加新行,并为其分配递增的 id

    我有一个现有的 HTML 表格 它是用户输入 GPS 点的表单的一部分 用户还可以选择上传 GPS 数据点 我想要一个用户可以按下的按钮 其中一些 Javascript 会向表中添加一个或多个新行 但新行必须继续增加表中使用的名称和 id
  • JavaScript 动画平滑滚动

    默认情况下 当您有这样的片段链接时 a href some url some fragment some text a 浏览器立即向下滚动到该片段 我该如何编程才能使用标准 JS 顺利地向下移动到该片段 这是一个例子 Example htt
  • 用数组反向查找对象

    假设我有一个这样的对象 resourceMap a 0 1 2 3 4 5 6 7 8 9 10 b 11 12 c 21 23 d 54 55 56 57 510 确定是否的最佳方法是什么resourceId 21将会 c 我们不知道钥匙
  • 使水平滚动条始终可见,即使底部不在视图中

    我将用一个片段来开始这个问题 该片段几乎显示了我想要完成的任务 wrapper overflow hidden display flex sidebar min width 200px background 333 color FFF co
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • Restangular - _.contains() 不是一个函数

    如果您最近通过 Bower 更新了 Restangular 它将安装最新的 Lodash 新的 4 0 然而 这是一个问题 因为 Restangular Angular 现在会抛出错误 contains 不是函数 你怎么解决 解决方案非常简

随机推荐