为什么使用 DOMStringList 而不是数组?

Luk*_*uke 6 javascript arrays dom

我最近发现了DOMStringList ,它可以在IndexedDB 的商店名称列表中找到。看起来 DOMStringList 只是数组的简化版本,它只有两个方法item()contains()在Array上没有像,indexOf那样有用的方法。为什么要使用这种对象呢?DOMStringList 有什么优点?filterforEach

Dom*_*nic 18

的存在DOMStringList是历史的偶然。如今,在现代 API 中,通过使用实例可以满足相同的用例Array

它被引入到 Web API 中是因为我们需要一些类似数组/列表且无法修改的东西。“无法修改”部分很重要,因为对于在以下情况下可修改数组会发生什么情况没有很好的答案

db.objectStoreNames.push("foo");
db.objectStoreNames.push(notAString);
db.objectStoreNames.shift();
Run Code Online (Sandbox Code Playgroud)

在引入第一个 API 时DOMStringList,设计 API 的人不知道如何使其与Arrays 一起工作。所以,他们设计了DOMStringList。它用于几个 API,即location.ancestorOriginsdb.objectStoreNames

但后来,设计此类 Web API 的人们想出了如何引入不可修改的数组。这实际上需要两次单独的尝试:

这两者之间的区别在于,Array即使浏览器也无法修改 freeze ;而 s 周围的代理Array可以由浏览器修改。(或者甚至是网络开发人员,如果相关规范允许的话。)

那么,我们可以移动所有东西来DOMStringList使用这些现代解决方案之一吗?不会。因为有一些代码依赖于db.objectStoreNames.item()并且可以工作,如果我们转移到没有这些方法的db.objectStoreNames.contains()实际实例,这些代码就会中断。Array

因此,如果我们想从 Web 平台上完全消除遗留的类似数组的类,并开始使用 true ,我们可能需要第三种 包装类型。它将是 的子类,具有一个或两个额外的方法,并且可能包含一个围绕它的代理。目前还没有人朝这个方向采取行动。ArrayArrayArray

(你说其他遗留的类似数组的类吗?是的:除了DOMStringList,我们还有TouchList, AnimationNodeList, CSSRuleList, DOMRectList, FileList, ... 请参阅Web 平台上带有方法的类列表item(),其中大多数(但不是全部)是这类。)