Von Ссылка :
Der strikte Modus macht
arguments
weniger bizarr magisch.Im normalen Code innerhalb einer Funktion, deren erstes Argument
arg
ist, Die Einstellungarg
setzt aucharguments[0]
und umgekehrt ( es sei denn nein Argumente wurden angegeben oderarguments[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 entsprechendenarguments[i]
.
Sie haben das "tatsächlich gefunden, es sei denn, Argumente [i] werden gelöscht" case;)
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?
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.
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.
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.
Tags und Links javascript arguments