为什么 FileList 对象不是数组?
文档:https://developer.mozilla.org/en-US/docs/Web/API/FileList
为什么是对象而不是数组?它唯一具有的属性是,并且它唯一具有的方法是 ,它是冗余的 ()。FileList
.length
.item()
fileList[0] === fileList.item(0)
文档:https://developer.mozilla.org/en-US/docs/Web/API/FileList
为什么是对象而不是数组?它唯一具有的属性是,并且它唯一具有的方法是 ,它是冗余的 ()。FileList
.length
.item()
fileList[0] === fileList.item(0)
好吧,可能有几个原因。首先,如果它是一个数组,你可以修改它。您无法修改实例。其次,但相关,它可能(可能是)浏览器数据结构的视图,因此最小的功能集使实现更容易提供它。FileList
您可以通过(这是ES2015方法,但通过polyfill它很简单)或通过将其转换为数组。a = Array.from(theFileList)
a = Array.prototype.slice.call(theFileList)
2018年更新:不过,有趣的是,该规范有一个关于以下内容的说明:FileList
该接口应被视为“有风险”,因为 Web 平台上的总体趋势是用 ECMAScript [ECMA-262] 中的平台对象替换此类接口。特别是,这意味着这种类型的语法存在风险;大多数其他编程使用不太可能受到最终迁移到某个类型的影响。
FileList
Array
filelist.item(0)
FileList
Array
我觉得这个音符很奇怪。我认为趋势是,而不是 - 例如更新到NodeList
,将其标记为与传播语法的兼容性,和。iterable
Array
iterable
for-of
forEach
我认为它是它自己的数据类型,因为面向对象编程在定义时比函数式编程更重要。现代Javascript提供了将类似数组的数据类型转换为数组的功能。
例如,正如Tim所描述的:const files = [...filesList]
使用 ES6 迭代 FileList 的另一种方法是 Array.from() 方法。
const fileListAsArray = Array.from(fileList)
IMO它比传播运算符更具可读性,但另一方面,它的代码更长,:)