为何选择使用DOMStringList而非JavaScript Array?
DOMStringList这类对象的存在,是Web API设计历史与特定场景需求结合的结果,它的核心优势主要体现在以下几点:
历史兼容性与API设计延续
它是早期DOM规范的产物,在ES5数组方法(indexOf、forEach等)尚未普及、Web API生态还未统一采用原生数组的阶段就被定义。像IndexedDB这类较早的API,沿用这个对象是为了保障旧有代码的兼容性,避免API变更导致历史项目失效。只读性带来的安全保障
DOMStringList通常是底层浏览器资源的只读视图(比如IndexedDB的对象仓库名称列表),你无法直接修改这个对象来改变底层资源。如果API直接返回普通数组,开发者可能误操作修改数组内容,但底层实际资源不会同步变化,反而会造成代码逻辑与实际状态的不一致。轻量的特定场景优化
它只保留了item()(按索引取元素)和contains()(判断元素是否存在)这两个字符串列表最核心的操作,没有多余方法带来的性能开销,非常适合用来暴露浏览器内部的资源列表——这类场景下,开发者最常用的就是判断某个名称是否存在、或者遍历取元素,不需要数组的全套方法。实时同步的视图能力(部分实现)
部分DOMStringList实现会和底层资源实时绑定:当底层数据发生变化时(比如新增了IndexedDB对象仓库),这个列表会自动更新,不需要开发者重新发起查询。而普通数组是静态快照,想要获取最新状态必须重新请求。
如果需要使用数组的高阶方法,完全可以通过Array.from(domStringList)或者扩展运算符[...domStringList]把它转换成原生数组,既保留DOMStringList的特性,又能利用数组的全部功能。
内容的提问来源于stack exchange,提问作者Luke

