Javascript-Argumente verschieben

8

Nehmen wir an, wir haben die folgende Funktion:

%Vor%

Ich verstehe, dass Daten und Typ nur Verweise auf bestimmte Werte in Argumenten sind. Aber warum sind die Daten am Ende gleich 3?

    
dimko1 26.05.2015, 12:49
quelle

5 Antworten

3

Von Ссылка :

  

Der strikte Modus macht arguments weniger bizarr magisch.

     

Im normalen Code innerhalb einer Funktion, deren erstes Argument arg ist,   Die Einstellung arg setzt auch arguments[0] und umgekehrt ( es sei denn nein   Argumente wurden angegeben oder arguments[0] wird gelöscht ).

     

arguments -Objekte für strikte Modusfunktionen speichern das Original   Argumente, wenn die Funktion aufgerufen wurde. arguments[i] wird nicht verfolgt   der Wert des entsprechenden benannten Arguments, noch ein named   Argument verfolgen den Wert in der entsprechenden arguments[i] .

Sie haben das "tatsächlich gefunden, es sei denn, Argumente [i] werden gelöscht" case;)

    
sp00m 26.05.2015, 13:22
quelle
2

Was Sie erhalten, ist ein Array Argumente mit [Daten, Typ] und zwei weitere Argumente werden nicht verwendet. Fügen Sie eine console.log vor und nach jeder Schicht hinzu und Sie werden sehen, was passiert;

%Vor%

Hilft das?

    
Georgios Dimitriadis 26.05.2015 13:09
quelle
0

Hier sehen Sie einen Schritt durch Ihren Code.

%Vor%

JS scheint im Hintergrund etwas Arbeit zu leisten. Wenn der entsprechende Index von arguments (der kein Array ist) von truthy zu falsy / undefined wechselt, wird der vorherige Wert beibehalten.

    
Sze-Hung Daniel Tsui 26.05.2015 13:11
quelle
0

Was Sie beobachten, trifft nur für nicht-striktes JavaScript zu, weshalb Sie sich nicht darauf verlassen sollten. Siehe Ссылка , dort ist ein Abschnitt, der das unterschiedliche Verhalten zwischen streng und nicht-streng erklärt Modus.

Sp00m hat eine nette Erklärung von MDN

Aus der EcmaScript-Spezifikation

  

ANMERKUNG 1: Für nicht strikte Modusfunktionen benennt der Array-Index (definiert in 15.4) Dateneigenschaften eines arguments-Objekts, dessen numerische Name-Werte kleiner sind als die Anzahl der formalen Parameter des entsprechenden Funktionsobjekts entsprechende Argument-Bindings im Ausführungskontext der Funktion. Dies bedeutet, dass das Ändern der Eigenschaft den entsprechenden Wert der Argumentbindung ändert und umgekehrt . Diese Korrespondenz wird unterbrochen, wenn eine solche Eigenschaft gelöscht und dann neu definiert wird oder wenn die Eigenschaft in eine Accessor-Eigenschaft geändert wird. Für strikte Modusfunktionen sind die Werte der Eigenschaften des arguments-Objekts einfach eine Kopie der Argumente, die an die Funktion übergeben werden, und es gibt keine dynamische Verknüpfung zwischen den Eigenschaftswerten und den formalen Parameterwerten.

%Vor%
    
Juan Mendes 26.05.2015 13:12
quelle
0

In Ihrem Fall ist 'data' ein Verweis auf die erste Position des arguments-Arrays. Wenn Sie Ihre Funktion aufrufen, lauten die Werte

%Vor%

Die Dokumentation gibt an, dass die Array-Funktion verschoben wird das erste Element. Aber sagt auch

  

shift ist absichtlich generisch; Diese Methode kann auf Objekte, die Arrays ähneln, aufgerufen oder angewendet werden. Objekte, die keine Längeneigenschaft enthalten, die die letzte in einer Reihe von aufeinander folgenden, auf Null basierenden numerischen Eigenschaften widerspiegelt, verhalten sich möglicherweise nicht sinnvoll.

Intern rufen die Schichtfunktionen den Löschoperator auf. Nach viermaligem Anwenden ist das Argumentarray [undefiniert, undefiniert]. Die Sache ist, dass das Aufrufen von delete auf einer Variablen es entfernt, aber wenn es immer noch einen Verweis auf die Variable gibt, wird der Wert nicht entfernt

%Vor%

Sie sehen also, dass die Variablen immer noch referenziert werden, obwohl Sie den Wert aus Argumenten gelöscht haben.

    
devconcept 26.05.2015 13:52
quelle

Tags und Links