Warum ist das FileList-Objekt nicht ein Array?

7

Dokumentation: Ссылка

Warum ist FileList ein Objekt und kein Array? Die einzige Eigenschaft, die es hat, ist .length und die einzige Methode, die es hat, ist .item() , was redundant ist ( fileList[0] === fileList.item(0) ).

    
Vladimir Kornea 15.08.2014, 20:10
quelle

4 Antworten

4

Nun, es könnte mehrere Gründe geben. Zum einen, wenn es ein Array wäre, könnten Sie es ändern. Sie können eine FileList -Instanz nicht ändern. Zweitens, aber verwandt, könnte es (wahrscheinlich) eine Ansicht auf eine Browser-Datenstruktur sein, so dass eine minimale Menge von Fähigkeiten es für Implementierungen einfacher macht, sie bereitzustellen.

Aktualisierung im Jahr 2018: Interessanterweise allerdings die WHAT-WG-Spezifikation hat einen Hinweis zu FileList :

  

Die Schnittstelle FileList sollte als "gefährdet" betrachtet werden, da der allgemeine Trend auf der Webplattform darin besteht, solche Schnittstellen durch das ECOAScript [ECMA-262] Array -Plattformobjekt zu ersetzen. Dies bedeutet insbesondere, dass die Syntax der Art filelist.item(0) gefährdet ist; Die meisten anderen programmatischen Anwendungen von FileList werden wahrscheinlich nicht von der eventuellen Migration auf einen Array -Typ beeinflusst.

(Was ich seltsam finde, ich dachte, der Trend wäre in Richtung iterable , nicht Array - wie das Update auf NodeList markiert es mit iterable für die Kompatibilität mit der Spreadsyntax, for-of und forEach .)

Sie können es auch in ein Array über Array.from(theFileList) konvertieren.

    
T.J. Crowder 15.08.2014, 20:14
quelle
19

Mit es6 können wir jetzt

const files = [...filesList]

Nützlich zum Beispiel, wenn Sie map über diese

setzen möchten     
Tim 05.05.2017 04:24
quelle
3

Wenn Sie Array-Methoden in FileList verwenden möchten, versuchen Sie apply

Also zum Beispiel:

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

wenn Sie alle

verwenden möchten     
machnicki 18.08.2016 20:32
quelle
0

Ich denke, es ist ein eigener Datentyp, weil die objektorientierte Programmierung mehr als eine funktionale Programmierung war, als sie definiert wurde. Aber modernes Javascript bietet Funktionen, um Arrays wie Datentypen in Arrays umzuwandeln.

Zum Beispiel wie Tim beschrieben: const files = [...filesList]

Eine weitere Möglichkeit, eine FileList mit ES6 zu iterieren, ist die Array.from () -Methode.

const fileListAsArray = Array.from(fileList)

IMO ist besser lesbar als der Spread-Operator. Aber auf der anderen Seite längeren Code:)

    
Valentin Rapp 19.10.2017 06:56
quelle

Tags und Links