为什么FileList对象不是数组?

Vla*_*nea 53 javascript

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

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

T.J*_*der 58

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

2018年更新:有趣的是,该规范有一个注释a = Array.from(theFileList):

a = Array.prototype.slice.call(theFileList)接口应被视为"危险",因为在Web平台总的趋势是,以取代与这样的接口FileList在ECMAScript中[ECMA-262]平台对象.特别是,这意味着该类型的语法存在FileList风险; 大多数其他程序化使用Array不太可能受到最终迁移到filelist.item(0)类型的影响.

(我觉得很奇怪,我认为趋势是朝向的FileList,而不是Array - 例如iterable标记它Array与扩展语法兼容的更新NodeList,和iterable.)

您也可以通过它将其转换为数组for-of.

  • 由于你无法修改它,因此它没有理由拥有`.push()`和其他数组方法. (3认同)
  • @VladimirKornea(时间流逝但是......)好吧,我有验证文件大小的用例,所以数组中的“过滤器”派上用场。还有许多其他“只读”方法。 (2认同)

Tim*_*Tim 33

有了es6,我们现在可以

const files = [...filesList]

例如,如果你想要map超过这些,那就很有用

  • 你不能这样做,它会像`fileList.slice不是函数`那样抛出错误,但你可以做`Array.from(filesList)` (27认同)
  • **不,你不能可靠地执行`[... filesList]`,甚至不能在2018年**.它是[未标记](https://w3c.github.io/FileAPI/#filelist-section),如[`NodeList`是]可迭代的(https://dom.spec.whatwg.org/#interface-nodelist)虽然Chrome和Firefox在其上实现了Symbol.iterator,但Edge并没有; [证明](https://jsfiddle.net/90swn949/)("得0"=成功,否则显示错误).正如@Dunos上面指出的那样,如果你正在转发支持IE,那么转换后的结果可能会失败(例如,试图在它上面使用`slice`,就像他/她似乎已经发生过一样). (13认同)

小智 18

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

例如,像蒂姆描述的那样: const files = [...filesList]

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

const fileListAsArray = Array.from(fileList)

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


小智 7

如果您想在 FileList 上使用数组方法,请尝试 apply

例如:

Array.prototype.every.call(YourFileList, file => { ... })

如果你想使用每个