Verwendung der Javascript-slice()-Methode ohne Argumente

Lesezeit: 4 Minuten

Benutzer-Avatar
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


Benutzer-Avatar
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.

  • Das ist wirklich verwirrend, da die array.slice() behauptet, mindestens ein Argument zu benötigen

    – Meawoppl

    28. Januar 2013 um 3:48 Uhr


  • @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.

    – Craig

    29. Oktober 2018 um 21:32 Uhr


Benutzer-Avatar
Marinos An

array.slice() = flache Kopie des Arrays und ist eine kürzere Form von array.slice()

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];

1055290cookie-checkVerwendung der Javascript-slice()-Methode ohne Argumente

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy