Array.prototype.lastIndexOf und String.prototype.lastIndexOf sind sehr praktische Methoden, aber viele Leute wissen nicht, dass sie tatsächlich zwei Parameter übergeben können:
Grammatik
str.lastIndexOf(searchValue[, fromIndex])
Die Methode lastIndexOf() gibt das letzte Vorkommen des angegebenen Werts in der Zeichenfolge zurück, die diese Methode aufruft, oder -1, wenn nicht gefunden. Suche vorwärts vom Ende der Zeichenfolge, beginnend bei fromIndex.
Parameter
1.searchValue
Eine Zeichenfolge, die den zu findenden Wert darstellt.
2.fromIndex
Beginnen Sie die Suche an der Stelle in der Zeichenfolge, an der die Methode aufgerufen wurde. Kann eine beliebige Ganzzahl sein. Der Standardwert ist str.length. Wenn es negativ ist, wird es als 0 behandelt. Wenn fromIndex > str.length, wird fromIndex als str.length behandelt.
Groß- und Kleinschreibung beachten
Bei der lastIndexOf-Methode wird die Groß-/Kleinschreibung beachtet. Der folgende Ausdruck gibt beispielsweise -1 zurück:
"Blue Whale, Killer Whale".lastIndexOf("blue"); // returns -1
Verwendung von lastIndexOf
// Create an array. var ar = ["ab", "cd", "ef", "ab", "cd"]; // 找到最后一个CD的位置 document.write(ar.lastIndexOf("cd") + "<br/>"); // 输出: 4 // 从正数第二个位置,搜索倒数第一个CD的位置 document.write(ar.lastIndexOf("cd", 2) + "<br/>"); // 输出: 1 // 从倒数第三个搜索最后一个ab的位置 document.write(ar.lastIndexOf("ab", -3) + "<br/>"); // 输出: 0
Die Verwendung von String.lastIndexOf ist ähnlich
"canal".lastIndexOf("a") // returns 3 "canal".lastIndexOf("a",2) // returns 1 "canal".lastIndexOf("a",0) // returns -1 从第0个往前搜,不存在'a',返回-1 "canal".lastIndexOf("x") // returns -1
IE8-Implementierung von lastIndexOf
Allerdings unterstützen IE8 und niedriger von Microsoft Array.lastIndexOf nicht und eine kompatible Implementierung ist erforderlich. Sie können sich beziehen auf:
if (!Array.prototype.lastIndexOf) { Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) { 'use strict'; if (this === void 0 || this === null) { throw new TypeError(); } var n, k, t = Object(this), len = t.length >>> 0; if (len === 0) { return -1; } n = len - 1; if (arguments.length > 1) { n = Number(arguments[1]); if (n != n) { n = 0; } else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } } for (k = n >= 0 ? Math.min(n, len - 1) : len - Math.abs(n); k >= 0; k--) { if (k in t && t[k] === searchElement) { return k; } } return -1; }; }
Sie können ES5-Slim verwenden, um ältere Browser vollständig kompatibel mit der ES5-Syntax zu machen.
Warum Sie die Verwendung von for in vermeiden sollten
Es ist jedoch zu beachten, dass nach dem Hinzufügen von Methoden zu Array.prototype die for in-Syntax auch die lastIndexOf-Methode aufzählt:
for (var idx in [1,3,5,7,9]) { console.log(idx) } >> 0 1 2 3 4 lastIndexOf
Sie sollten stattdessen eine for-Schleife verwenden
for (var idx = 0; idx < [1,3,5,7,9].length; idx++) { console.log(idx) }
Dieses Problem kann mithilfe von Object.defineProperty implementiert werden, um die lastIndexOf-Methode von for in der Aufzählung zu vermeiden:
Object.defineProperty(Array, "lastIndexOf", { enumerable: false })
Browser, die im Allgemeinen kompatible Implementierungen erfordern, unterstützen die Methode defineProperty jedoch überhaupt nicht. Und in den meisten Browsern ist for in viel langsamer als die for-Schleife, daher sollten Sie versuchen, die Verwendung von for in zu vermeiden. Aber wie listet man die Schlüssel von Objekteigenschaften auf? Verwenden Sie Object.keys({ a:1 }), um ein Array von Schlüsseln zurückzugeben.