Warum hat JavaScript keine letzte Methode? [closed]

Lesezeit: 6 Minuten

Benutzer-Avatar
Nikhil Garg

Es ist irgendwie seltsam, dass die JavaScript-Array-Klasse keine letzte Methode zum Abrufen des letzten Elements eines Arrays anbietet. Ich weiß, dass die Lösung einfach ist (Ar[Ar.length-1] ), aber dennoch wird dies zu häufig verwendet.

Gibt es ernsthafte Gründe, warum dies noch nicht integriert ist?

  • Für Fälle, in denen es Ihnen nichts ausmacht, das Array als Nebeneffekt zu ändern (dh wenn das Array sowieso nur temporär ist), wäre die Redewendung item= array.pop();.

    – Bobin

    13. Juli 2010 um 8:08 Uhr

  • Hier ist ein Leistungsbenchmark für viele der genannten Methoden: jsperf.com/get-last-item-from-array

    – Webdesigner

    23. Mai 2013 um 2:52 Uhr

  • Mein Gott, nachdem Sie sich diese Perf-Seite angesehen haben, erscheint es array[array.length-1] ist Weg schneller als die anderen.

    – Jondlm

    30. Mai 2013 um 14:59 Uhr

  • @JondIm, aber wenn Sie ein Array in Funktion erstellen, müssen Sie einen lokalen Namen dafür erfinden (was zu Namen wie arr2 führt), und Sie haben 2 Codezeilen anstelle von Oneliner

    – Donauseefahrer

    7. Juni 2013 um 13:04 Uhr

  • (Ar[Ar.length-1]) bekommt 20x bessere Leistung für mich.

    – Jewgeni Sergejew

    19. Juni 2013 um 14:03 Uhr

Benutzer-Avatar
Alvaro González

Sie können so etwas tun:

[10, 20, 30, 40].slice(-1)[0]

console.log([10, 20, 30, 40].slice(-1)[0])

Die Menge an Hilfsmethoden, die einer Sprache hinzugefügt werden können, ist unendlich. Ich nehme an, sie haben einfach nicht daran gedacht, dieses hinzuzufügen.

  • versucht, für “nah an der Unendlichkeit” abzustimmen

    – Kenan-Banken

    13. Juli 2010 um 7:44 Uhr

  • Wieso den? Sie können so nah herankommen, wie Sie möchten, keine Begrenzung 🙂

    – Alvaro González

    13. Juli 2010 um 7:49 Uhr

  • Dieser sollte die Antwort sein.

    – Giampaolo Rodola

    16. Dezember 2011 um 13:58 Uhr

  • @UpTheCreek, weil Sie das Array nicht in einer Variablen speichern müssen.

    – rmobis

    29. November 2012 um 19:11 Uhr

  • @ÁlvaroG.Vicario Dies ist für ein Array von Referenzen in Ordnung, aber in Ihrem Beispiel arbeiten Sie mit Zahlen. Gemäß dem MDN-Dokument: „Slice kopiert Zeichenfolgen und Zahlen in das neue Array. Änderungen an der Zeichenfolge oder Zahl in einem Array wirken sich nicht auf das andere Array aus.“ Wenn der Entwickler eine Referenz “array.last” erhalten möchte, um etwas mit dem Wert des letzten Elements in seinem ursprünglichen Array zu tun, und die Array-Werte zufällig String- oder Zahlenliterale sind, funktioniert diese Methode nicht.

    – 1nendlich

    21. Mai 2013 um 15:10 Uhr


Benutzer-Avatar
Anurag

Es ist einfach, selbst einen zu definieren. Das ist die Stärke von JavaScript.

if(!Array.prototype.last) {
    Array.prototype.last = function() {
        return this[this.length - 1];
    }
}

var arr = [1, 2, 5];
arr.last(); // 5

Dies kann jedoch zu Problemen mit Code von Drittanbietern führen, der (fälschlicherweise) verwendet wird for..in Schleifen, um über Arrays zu iterieren.

Allerdings, wenn Sie nicht mit gebunden sind Browserunterstützung Probleme, dann mit der neuen ES5-Syntax zu Eigenschaften definieren kann dieses Problem lösen, indem Sie die Funktion nicht aufzählbar machen, wie folgt:

Object.defineProperty(Array.prototype, 'last', {
    enumerable: false,
    configurable: true,
    get: function() {
        return this[this.length - 1];
    },
    set: undefined
});

var arr = [1, 2, 5];
arr.last; // 5

  • Beachten Sie, dass das Hinzufügen von Eigenschaften zum Prototyp von Array Code beschädigen kann, wenn for..in verwendet wird, um über ein Array zu iterieren. Die Verwendung von for..in zum Iterieren eines Arrays ist eine schlechte Übung, aber es wird häufig genug gemacht, dass das Ändern des Prototyps von Array ebenfalls eine schlechte Übung ist. Im Allgemeinen sollten Prototypen von Object, Array, String, Number, Boolean und Date nicht geändert werden, wenn Ihr Skript mit anderem unbekannten Code arbeiten muss.

    – Dagg Nabbit

    13. Juli 2010 um 8:35 Uhr


  • @no – Danke für den Tipp. Ich hätte erwähnen sollen, dass der Grund für das Hinzufügen der ES5-Syntax mit auf „false“ gesetzter Enumerability genau darin bestand, das Problem zu lösen for..in Problem. Sicher, wir sind noch nicht so weit mit einer breiten Implementierung von ES5, aber es ist gut genug, es jetzt zu wissen, da Browser es schnell einholen, einschließlich IE9.

    – Anurag

    13. Juli 2010 um 8:49 Uhr


  • Bei leeren Listen this.length - 1 wertet zu -1die, da es sich um eine negative Zahl handelt, als Array-Eigenschaft und nicht als Elementindex behandelt wird.

    – Tonbildung

    6. August 2012 um 20:23 Uhr

Denn Javascript ändert sich sehr langsam. Und das liegt daran, dass die Leute Browser langsam aktualisieren.

Viele Javascript-Bibliotheken implementieren ihre eigenen last() Funktion. Verwenden Sie eine!

  • Zumindest sollten Sie erwägen, eine Bibliothek vorzuschlagen, die die Implementierung bereitstellen würde. Beispielsweise ist Underscore.js eine gute Wahl. Sehen documentcloud.github.com/underscore/#last

    – Sean Lynchen

    3. Oktober 2011 um 22:37 Uhr


  • @ Sean – Ich dachte, ich würde mich aus dem Geschäft heraushalten, dem Originalposter eine bestimmte Javascript-Bibliothek zu empfehlen. Google leistet ziemlich gute Arbeit bei der Bewertung der kollektiven Meinung des Webs darüber, welche Bibliothek verwendet werden soll. Warum sollte ich einen bestimmten vorschlagen? Warum haben Sie eigentlich underscore.js empfohlen, das mir auf den ersten Blick sehr aktuell erscheint?

    – Kenan-Banken

    3. Oktober 2011 um 23:18 Uhr

  • Ich bevorzuge eigentlich die folgende Antwort, die Funktion außerhalb einer Bibliothek zu implementieren. Als jemand, der über Google auf diese Frage gestoßen ist, habe ich jedoch vorgeschlagen, dass die Top-Antwort anderen hilft, ihre Suche nach einer Lösung fortzusetzen, anstatt sie zum Zurück-Button zu schicken.

    – Sean Lynchen

    4. Oktober 2011 um 18:38 Uhr

  • Die Frage war “Warum ist diese Funktion nicht in Javascript integriert” und nicht “Wie kann diese Funktionalität erreicht werden”. Es gibt keinen Grund zu der Annahme, dass der ursprüngliche Autor danach gesucht hat, wie er tatsächlich sein eigenes schreiben kann last() Funktion. Die Frage betraf die Art der Entwicklung der Javascript-Kernsprache selbst.

    – Kenan-Banken

    4. Oktober 2011 um 18:53 Uhr

  • Aber wenn @Nikhil wissen möchte, wie man es implementiert – Unterstrich hat eine wunderbare kommentierte Quelle. Diese Implementierung von last() ist ziemlich robust, wahrscheinlich mehr als von diesem Autor benötigt, aber großartig für eine Bibliothek. documentcloud.github.com/underscore/docs/…

    – Rekonbot

    1. Juni 2012 um 14:35 Uhr

Benutzer-Avatar
Silviu-Marian

i = [].concat(loves).pop(); //corn

Symbolkatze liebt Popcorn

Eine weitere Option, insbesondere wenn Sie bereits UnderscoreJS verwenden, wäre:

_.last([1, 2, 3, 4]); // Will return 4

Array.prototype.last = Array.prototype.last || function() {
    var l = this.length;
    return this[l-1];
}

x = [1,2];
alert( x.last() )

Benutzer-Avatar
Daniel

Kam hierher, um selbst nach einer Antwort auf diese Frage zu suchen. Die Slice-Antwort ist wahrscheinlich die beste, aber ich habe eine “letzte” Funktion erstellt, nur um das Erweitern von Prototypen zu üben, also dachte ich, ich würde weitermachen und sie teilen. Es hat den zusätzlichen Vorteil gegenüber einigen anderen, dass Sie optional rückwärts durch das Array zählen und beispielsweise das vorletzte oder drittletzte Element herausziehen können. Wenn Sie keine Anzahl angeben, wird standardmäßig nur 1 verwendet und das letzte Element herausgezogen.

Array.prototype.last = Array.prototype.last || function(count) {
    count = count || 1;
    var length = this.length;
    if (count <= length) {
        return this[length - count];
    } else {
        return null;
    }
};

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.last(); // returns 9
arr.last(4); // returns 6
arr.last(9); // returns 1
arr.last(10); // returns null

  • Wenn Sie verwenden last(4) oder last(9) Sie verlieren die Bedeutung des Funktionsnamens, dh; last

    – Prashanth Shyamprasad

    28. Juni 2014 um 6:47 Uhr


1246060cookie-checkWarum hat JavaScript keine letzte Methode? [closed]

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

Privacy policy