2017-03-01 4 views
0

Es wurde eine Function.prototype.arity -Eigenschaft für die Anzahl der Argumente Funktion erwartet erwartet. Jetzt ist es veraltet (seit JS 1.4), und das gleiche Ziel hat Function.prototype.length.Was genau `Function.prototype.length` bedeutet?

Aber vor kurzem habe ich einen Artikel in der Dokumentation über Array.prototype.reduce Methode gefunden. Und er sagt deutlich, dass die Methode Eigenschaft hat length gleich 1:

Die length Eigenschaft der reduce Methode 1.

Dieser exakte Artikel einen Header mit der Anzahl der Argumente hat, und es gibt zwei von ihnen:

Array.prototype.reduce (callbackfn [, initial])

callbackfn und initialValue (optional).

So ist es mir nicht klar, was genau der Zweck von length Eigentum.
Wenn es verwendet wird, um dem Entwickler nützliche Informationen zu geben, dann ist dies nicht der Fall.
Wenn es sich nur um eine technische automatisch generierte Eigenschaft handelt, die nur die Anzahl der Argumente in der Funktionsdefinition angibt, warum sollte die Konsistenz nicht beibehalten werden?

+1

[ECMAScript 5.1, Abschnitt 15.3.5.1, 'Länge'] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.5.1):" _Der Wert der length -Eigenschaft ist eine Ganzzahl, die die ** "typische" Anzahl von Argumenten angibt, die von der Funktion erwartet werden. Die Sprache erlaubt es jedoch, die Funktion mit einer anderen Anzahl von Argumenten aufzurufen._ " – Andreas

+0

' reduce 'erwartet einen Parameter (notwendig) und das andere ist optional, also zählt es nicht! –

+0

zumindest muss man eine Callback-Funktion ausführen, um zu reduzieren. –

Antwort

0

Array.prototype.reduce ‚s length ist 1, da der zweite Parameter ist optional. *

So ist es mir nicht klar ist, was genau der Zweck der length Eigenschaft.

den Entwickler sagen, wie viele Parameter erklärt sie mit einem Standardwert (falls vorhanden) oder den Rest Parameter (falls vorhanden) vor dem ersten Parameter hat, je nachdem, was frühestens in der Parameterliste ist. Oder als the spec puts it:

Der Wert der Eigenschaft length eine ganze Zahl ist, die die typische Anzahl von Argumenten zu erwarten durch die Funktion anzeigt.

Der genaue Algorithmus ist in the spec's Static Semantics: ExpectedArgumentCount section.

Wenn es verwendet wird, um dem Entwickler nützliche Informationen zu geben, dann ist dies nicht der Fall.

Nun, das ist eine Frage der Meinung. :-)

Wenn Sie eine Sprache wie JavaScript haben, wo Funktionen nur eine Erwartung ausdrücken können, aber mit weniger oder mehr Argumenten aufgerufen werden können, und insbesondere wenn Sie die Konzepte von Standardparameterwerten und Ruheparametern hinzufügen, ist das nicht überraschend Die Funktionalität ist ein bisschen ein weiches Konzept.

Einige Spaß Beispiele:

function ex1(a) { }    // length is 1, of course 
function ex2(a, b = 42) { }  // length is 1, `b` has a default 
function ex3(a, b = 42, c) { } // length is 1, `b` has a default and 
           // `c` is after `b` 
function ex4(a, ...rest) { } // length is 1 yet again, rest parameter doesn't count 

* In ES5, würde seine Erklärung in JavaScript sein:

function reduce(callback) { 
    // ... 
} 

... und dann wäre es arguments.length ob Sie bestimmen, verwenden‘ d angenommen, ein initialValue.

In ES2015 + (aka "ES6" +), wäre es entweder noch so sein, oder so aussehen:

function reduce(callback, ...args) { 
    // ... 
} 

... und verwenden args.length, um zu sehen, ob es einen Anfangswert war.

Oder vielleicht wie folgt aus:

const omitted = {}; 
function reduce(callback, initialValue = omitted) { 
    // ... 
} 

... und dann initialValue === omitted verwenden zu wissen, ob Sie einen Anfangswert geliefert hatte. (Der Standardwert von initialValue kann nicht undefined oder null oder ähnlich sein, da die Funktion auf Zweig basiert hat, ob das Argument zur Verfügung gestellt wurde [nicht das, was ihr Wert ist]. Aber wir können das tun, mit Objektidentität.)

+0

All dies, außer vielleicht die restlichen Parameter, ist in JavaScript nicht sehr intuitiv. –

+0

@DmitryParzhitsky: Ja, nun, wieder, es ist eine Frage der Meinung. Die Standardparameterwerte, die nicht gezählt wurden, waren für mich ursprünglich überraschend, aber man muss sich daran erinnern, dass sie der Sprache 20 Jahre nach ihrer Erstellung hinzugefügt wurden. TC39 (das Komitee, das die Sprache verwaltet) hat eine * sehr * schwierige Aufgabe, JavaScript vorwärts zu bringen, ohne Dinge zu brechen, die vor 15 Jahren geschrieben wurden und immer noch überall verwendet werden. Das übliche Idiom für Standardparameter, bevor wir sie in der Sprache hatten, führte dazu, dass sie nicht gezählt wurden, also vermute ich, dass sie deshalb so gingen. :-) –

-2

Länge ist eine Eigenschaft des Array-Objekts. Es gibt die Anzahl der Elemente in einem Array zurück. Es ist sehr nützlich. Das sind Informationen über das Internet.

+0

Eigenschaften ['Array.prototype.length'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length) und [' Function.prototype. Länge '] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length) sind ziemlich unterschiedlich :) –

+0

Die Frage ist eindeutig über die' length'-Eigenschaft auf * * functions **, nicht die Eigenschaft 'length' für Arrays oder Strings. –