文档:https : //developer.mozilla.org/zh-CN/docs/Web/API/FileList
为什么是FileList对象而不是数组?它唯一的属性是.length,唯一的方法是.item(),这是多余的(fileList[0] === fileList.item(0))。
文档:https : //developer.mozilla.org/zh-CN/docs/Web/API/FileList
为什么是FileList对象而不是数组?它唯一的属性是.length,唯一的方法是.item(),这是多余的(fileList[0] === fileList.item(0))。
Answers:
好吧,可能有几个原因。例如,如果它是一个数组,则可以对其进行修改。您无法修改FileList实例。其次,但与此相关的是,它可能是(可能是)浏览器数据结构的视图,因此最少的功能集使实现更容易提供它。
您可以通过a = Array.from(theFileList)(将其转换为数组,这是ES2015方法,但是对它进行polyfill很简单)或通过a = Array.prototype.slice.call(theFileList)。
2018年更新:有趣的是,该规范对以下内容进行了说明FileList:
该
FileList接口应被视为“危险”,因为在Web平台上总的趋势是,以取代与这样的接口Array在ECMAScript中[ECMA-262]平台对象。特别是,这意味着这种语法存在filelist.item(0)风险;FileList最终迁移到Array类型后,大多数其他程序性使用都不太可能受到影响。
我觉得那张纸条很奇怪。我认为趋势iterable并非Array 如此,例如将其NodeList标记iterable为与扩展语法兼容的更新for-of,和forEach。
.push()和其他数组方法。
这里有一对夫妇加polyfills的toObject()功能File和toArray()功能FileList:
File.prototype.toObject = function () {
return Object({
lastModified: parseInt(this.lastModified),
lastModifiedDate: String(this.lastModifiedDate),
name: String(this.name),
size: parseInt(this.size),
type: String(this.type)
})
}
FileList.prototype.toArray = function () {
return Array.from(this).map(function (file) {
return file.toObject()
})
}
var files = document.getElementById('file-upload').files
var fileObject = files[0].toObject()
var filesArray = files.toArray()
NodeLists和HTMLCollections。例如,如果一种语言不支持该foo[bar]语法怎么办?