2015-10-05 18 views
7

Secondo MDN:Perché ES6 definisce map.length == 0?

Map.length

Il valore della proprietà length è 0.

Qual è il caso d'uso per questo? Capisco perché Map.size è semanticamente corretto. Ma sicuramente un Map.length che restituisce quasi sempre la risposta "sbagliata" è una cattiva idea, soprattutto se c'è un codice di migrazione di supervisione da ES5. C'è un modo per forzare un errore quando viene usato?

+0

[Ecco anche la parte rilevante della specifica] (http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-constructor) –

+6

Dice ' Map.length' è '0'. Non che la proprietà '.length' di una' nuova Map() 'sia' 0'. Prova: 'var m = new Map(); console.log (m.length, m.size, Map.length); '. –

+1

Ancora non spiega * perché * 'Map.length === 0' però. –

risposta

15

I costruttori in JavaScript sono funzioni regolari e la proprietà length di una funzione corrisponde al numero di parametri formali previsti dalla funzione, che è 0 nel caso di Map.

Contrasto con RegExp.length, che è 2, perché il costruttore RegExp prevede due parametri (motivo e contrassegni).

+0

Tuttavia non è abbastanza coerente, perché il parametro 'flags' su' RegExp' è opzionale, come 'iterable' a' Map', quindi 'Map.length' dovrebbe essere 1 per quella logica? –

+3

@JamesThorpe In realtà le funzioni native - diversamente dalle funzioni definite dall'utente - non hanno nemmeno una definizione formale, e quindi la proprietà 'length' è semplicemente specificata dallo standard ECMAScript, e questa specifica può certamente prendere in considerazione i problemi di compatibilità sull'uso reale preoccupazioni. Lo _spirit_, però, è lo stesso. –

+0

@JamesThorpe FWIW: La specifica lo descrive come _ "il tipico numero di argomenti previsti dalla funzione" _ – zeroflagL