为什么 FileList 对象不是数组?

2022-08-30 05:18:31

文档:https://developer.mozilla.org/en-US/docs/Web/API/FileList

为什么是对象而不是数组?它唯一具有的属性是,并且它唯一具有的方法是 ,它是冗余的 ()。FileList.length.item()fileList[0] === fileList.item(0)


答案 1

好吧,可能有几个原因。首先,如果它是一个数组,你可以修改它。您无法修改实例。其次,但相关,它可能(可能是)浏览器数据结构的视图,因此最小的功能集使实现更容易提供它。FileList

您可以通过(这是ES2015方法,但通过polyfill它很简单)或通过将其转换为数组。a = Array.from(theFileList)a = Array.prototype.slice.call(theFileList)

2018年更新:不过,有趣的是,该规范有一个关于以下内容的说明:FileList

该接口应被视为“有风险”,因为 Web 平台上的总体趋势是用 ECMAScript [ECMA-262] 中的平台对象替换此类接口。特别是,这意味着这种类型的语法存在风险;大多数其他编程使用不太可能受到最终迁移到某个类型的影响。FileListArrayfilelist.item(0)FileListArray

我觉得这个音符很奇怪。我认为趋势是,而不是 - 例如更新到NodeList,将其标记为与传播语法的兼容性,和。iterableArrayiterablefor-offorEach


答案 2

我认为它是它自己的数据类型,因为面向对象编程在定义时比函数式编程更重要。现代Javascript提供了将类似数组的数据类型转换为数组的功能。

例如,正如Tim所描述的:const files = [...filesList]

使用 ES6 迭代 FileList 的另一种方法是 Array.from() 方法。

const fileListAsArray = Array.from(fileList)

IMO它比传播运算符更具可读性,但另一方面,它的代码更长,:)