2015-10-05 9 views
7

Nach MDN:Warum definiert ES6 map.length == 0?

Map.length

Der Wert der Länge Eigenschaft ist 0.

Was der Anwendungsfall dafür ist? Ich verstehe, warum Map.size semantisch korrekt ist. Aber sicherlich ist eine Map.length, die fast immer die "falsche" Antwort zurückgibt, eine schlechte Idee, besonders wenn es einen Kontrollcode von ES5 gibt. Gibt es eine Möglichkeit, einen Fehler zu erzwingen, wenn dieser verwendet wird?

+0

[Hier ist der relevante Teil der Spezifikation] (http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-constructor) –

+6

Es sagt ' Map.length' ist '0'. Nicht dass die '.length' Eigenschaft einer' neuen Map() '' 0' ist. Versuchen Sie: 'var m = new Map(); console.log (m.length, m.size, Map.length); '. –

+1

Erklärt noch nicht * warum * 'Map.length === 0'. –

Antwort

15

Konstruktoren in JavaScript sind reguläre Funktionen, und die length Eigenschaft einer Funktion entspricht der Anzahl der Formalparameter, die von der Funktion erwartet werden, die 0 im Fall von Map ist.

Vergleichen Sie dies mit RegExp.length, die 2 ist, weil der RegExp Konstruktor zwei Parameter erwartet (Muster und Flags).

+0

Das ist aber nicht ganz konsistent, weil der 'flags' Parameter zu' RegExp' optional ist, ebenso wie 'iterable' zu ​​'Map', also sollte' Map.length' von dieser Logik 1 sein? –

+3

@JamesThorpe Tatsächlich haben native Funktionen - im Gegensatz zu benutzerdefinierten Funktionen - nicht einmal eine formale Definition, und daher wird die 'length'-Eigenschaft einfach durch den ECMAScript-Standard spezifiziert, und diese Spezifikation kann durchaus Kompatibilitätsprobleme über die reale Verwendung hinweg berücksichtigen Bedenken. Der Geist ist jedoch der gleiche. –

+0

@JamesThorpe FWIW: Die Spezifikation beschreibt es als _ "die typische Anzahl von Argumenten erwartet von der Funktion" _ – zeroflagL