Verwendung der Javascript-slice()-Methode ohne Argumente
Lesezeit: 4 Minuten
Benutzer886596
Ich lese das gerade durch jquery-Maskierungs-Plugin zu versuchen und zu verstehen, wie es funktioniert, und an zahlreichen Stellen nennt der Autor das slice() Funktion, die ihr keine Argumente übergibt. Hier zum Beispiel die _buffer variabel ist slice()d, und _buffer.slice() und _buffer scheinen die gleichen Werte zu haben.
Gibt es dafür einen Grund oder macht der Autor den Code nur komplizierter, als er sein sollte?
//functionality fn
function unmaskedvalue($input, skipDatepickerCheck) {
var input = $input[0];
if (tests && (skipDatepickerCheck === true || !$input.hasClass('hasDatepicker'))) {
var buffer = _buffer.slice();
checkVal(input, buffer);
return $.map(buffer, function(element, index) {
return isMask(index) && element != getBufferElement(_buffer.slice(), index) ? element : null; }).join('');
}
else {
return input._valueGet();
}
}
Kein kompetenter Programmierer würde jemals Code komplizierter machen, als er sein muss.
– Alex
2. Juli 2012 um 1:32 Uhr
Es ist notwendig. Das slice -Methode wird zu Beginn der Funktion verwendet, um die ursprünglichen Array-Elemente zu sichern, bevor sie von der Funktion geändert werden. Auf diese Weise hat der Autor Zugriff auf die Positionen, Schlüssel und Werte des ursprünglichen Arrays, auch nach und während der Bearbeitung des Arrays. Dies ist unverzichtbar, wenn Sie eine verantwortungsbewusste Schnittstelle zur Manipulation von Zeichenfolgen erstellen, wie Ihr Beispiel-Plugin. Ergänzend zum Kommentar von @alex, wenn es da ist, gibt es einen Grund dafür. Strg+F die Quelle und suchen Sie später nach, wo darauf zugegriffen wird, wenn Sie ein besseres Verständnis benötigen.
– Fabrício Matté
2. Juli 2012 um 1:39 Uhr
nnnnn
Das .slice() -Methode erstellt eine (flache) Kopie eines Arrays und verwendet Parameter, um anzugeben, welche Teilmenge des Quellarrays kopiert werden soll. Wenn Sie es ohne Argumente aufrufen, wird einfach das gesamte Array kopiert. Das ist:
_buffer.slice();
// is equivalent to
_buffer.slice(0);
// also equivalent to
_buffer.slice(0, _buffer.length);
EDIT: Ist der Startindex nicht obligatorisch? Ja. Und nein. Art von. JavaScript-Referenzen (wie MDN) sagen das normalerweise .slice() erfordert mindestens ein Argument, das Anfang Index. Berufung .slice() ohne Argumente ist wie gesagt .slice(undefined). In dem ECMAScript-SprachspezSchritt 5 in der .slice() Algorithmus sagt “Let relativeStart sein ToInteger(start)“. Wenn Sie sich den Algorithmus für die abstrakte Operation ansehen ToInteger()die wiederum verwendet ToNumber()Sie werden sehen, dass es am Ende konvertiert wird undefined zu 0.
Trotzdem würde ich in meinem eigenen Code immer sagen .slice(0)nicht .slice() – für mich scheint es ordentlicher.
@meawoppl – Ich habe meine Antwort aktualisiert, um zu erklären, warum es ohne Argumente funktioniert.
– nnnnn
28. Januar 2013 um 5:50 Uhr
Danke für die Erklärung ohne Argumente, danach habe ich gesucht
– Revolutionär
24. April 2013 um 10:59 Uhr
“Ich werde dieses Sandwich überhaupt nicht in Scheiben schneiden”
– Graham P Heath
23. Januar 2016 um 3:00 Uhr
es macht eine flache Kopie, die ich gerade gelesen habe, bedeutet, dass das kopierte Objekt nicht nur das gesamte Array kopiert, es scheint, dass es das Array kopiert, aber alle alten Speicherreferenzen an Ort und Stelle belässt – also ändern Sie einen String-Wert im kopierten Array und Es werden zwei verschiedene Arrays mit unterschiedlichen Werten sein, da eine Zeichenfolge direkt als Wert gespeichert wird, aber Sie ändern eine Eigenschaft eines Objekts und es aktualisiert beide. Ich denke, was Sie hier wollten, ist eine tiefe Kopie.
Gibt es dafür einen Grund oder macht der Autor den Code nur komplizierter, als er sein sollte?
Ja, in den folgenden Fällen kann es einen Grund geben (für den wir im bereitgestellten Code keine Ahnung haben, ob sie zutreffen):
checkVal() oder getBufferElement() ändern den Inhalt der an sie übergebenen Arrays (als zweites bzw. erstes Argument). In diesem Fall will der Code-Autor das verhindern Globale Variable_bufferDer Inhalt von wird beim Aufrufen nicht geändert unmaskedvalue().
Die Funktion übergeben an $.map läuft asynchron. In diesem Fall möchte der Codeautor sicherstellen, dass der übergebene Rückruf auf den Inhalt des Arrays so zugreift, wie er während war unmaskedvalue() Ausführung (z. B. könnte ein anderer Event-Handler modifizieren _buffer Inhalt nach unmaskedvalue() Ausführung und davor $.mapCallback-Ausführung von ).
Wenn keiner der oben genannten Fälle zutrifft, ja, Der Code würde auch ohne Verwendung funktionieren .slice(). In diesem Fall möchte der Codeautor vielleicht auf Nummer sicher gehen und Fehler durch zukünftige Codeänderungen vermeiden, die zu unvorhergesehenen Ergebnissen führen würden _buffer inhaltliche Änderungen.
Notiz:
Beim sagen: “verhindere den Globale Variable_bufferder Inhalt von wird nicht geändert” es bedeutet, Folgendes zu erreichen:
_buffer[0].someProp = "new value" würde sich im kopierten Array widerspiegeln.
_buffer[0] = "new value"würde sich nicht im kopierten Array widerspiegeln.
(Um Änderungen auch im ersten Punkt oben zu verhindern, Array-Deep-Klon kann verwendet werden, aber dies ist aus dem diskutierten Kontext heraus)
Anmerkung 2:
Bei ES6
var buffer = _buffer.slice();
kann auch geschrieben werden als
var buffer = [..._buffer];
10552900cookie-checkVerwendung der Javascript-slice()-Methode ohne Argumenteyes
Kein kompetenter Programmierer würde jemals Code komplizierter machen, als er sein muss.
– Alex
2. Juli 2012 um 1:32 Uhr
Es ist notwendig. Das
slice
-Methode wird zu Beginn der Funktion verwendet, um die ursprünglichen Array-Elemente zu sichern, bevor sie von der Funktion geändert werden. Auf diese Weise hat der Autor Zugriff auf die Positionen, Schlüssel und Werte des ursprünglichen Arrays, auch nach und während der Bearbeitung des Arrays. Dies ist unverzichtbar, wenn Sie eine verantwortungsbewusste Schnittstelle zur Manipulation von Zeichenfolgen erstellen, wie Ihr Beispiel-Plugin. Ergänzend zum Kommentar von @alex, wenn es da ist, gibt es einen Grund dafür. Strg+F die Quelle und suchen Sie später nach, wo darauf zugegriffen wird, wenn Sie ein besseres Verständnis benötigen.– Fabrício Matté
2. Juli 2012 um 1:39 Uhr