Array.prototype.lastIndexOf et String.prototype.lastIndexOf sont des méthodes très pratiques, mais beaucoup de gens ne savent pas qu'elles peuvent réellement transmettre deux paramètres. Le deuxième paramètre détermine la position de départ de la recherche :
.Grammaire
str.lastIndexOf(searchValue[, fromIndex])
La méthode lastIndexOf() renvoie la dernière occurrence de la valeur spécifiée dans la chaîne qui appelle cette méthode, ou -1 si elle n'est pas trouvée. Recherche vers l'avant à partir de la fin de la chaîne, en commençant par fromIndex.
Paramètres
1.searchValue
Une chaîne représentant la valeur à trouver.
2.fromIndex
Commencez la recherche à la position dans la chaîne où la méthode a été appelée. Peut être n’importe quel nombre entier. La valeur par défaut est str.length. S’il est négatif, il est traité comme 0. Si fromIndex > str.length, alors fromIndex est traité comme str.length.
Sensible à la casse
La méthode lastIndexOf est sensible à la casse. Par exemple, l'expression suivante renvoie -1 :
"Blue Whale, Killer Whale".lastIndexOf("blue"); // returns -1
Utilisation de 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
La même utilisation de String.lastIndexOf est similaire
"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
Implémentation IE8 de lastIndexOf
Cependant, IE8 et versions antérieures de Microsoft ne prennent pas en charge Array.lastIndexOf et une implémentation compatible est requise. Vous pouvez vous référer à :
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; }; }
Vous pouvez utiliser ES5-Slim pour rendre les anciens navigateurs entièrement compatibles avec la syntaxe ES5.
Pourquoi devriez-vous éviter d'utiliser for in
Cependant, il convient de noter qu'après avoir ajouté des méthodes à Array.prototype, la syntaxe for in énumérera également la méthode lastIndexOf :
for (var idx in [1,3,5,7,9]) { console.log(idx) } >> 0 1 2 3 4 lastIndexOf
Vous devriez plutôt utiliser la boucle for
for (var idx = 0; idx < [1,3,5,7,9].length; idx++) { console.log(idx) }
Ce problème peut être implémenté en utilisant Object.defineProperty pour éviter la méthode lastIndexOf de for dans l'énumération :
Object.defineProperty(Array, "lastIndexOf", { enumerable: false })
Cependant, les navigateurs qui nécessitent généralement des implémentations compatibles ne prennent pas du tout en charge la méthode DefineProperty. Et dans la plupart des navigateurs, for in est beaucoup plus lent que la boucle for, vous devriez donc essayer d'éviter d'utiliser for in. Mais comment énumérer les clés des propriétés d’un Objet ? Utilisez Object.keys({ a:1 }) pour renvoyer un tableau de clés.