Array.prototype.lastIndexOf と String.prototype.lastIndexOf は非常に実用的なメソッドですが、多くの人は実際に 2 つのパラメーターを渡すことができることを知りません。2 番目のパラメーターは検索の開始位置を決定します。
文法
str.lastIndexOf(searchValue[, fromIndex])
パラメータ
1.searchValue
検索する値を表す文字列。
2.fromIndex
メソッドが呼び出された文字列内の位置から検索を開始します。任意の整数を指定できます。デフォルト値は str.length です。負の場合は0として扱われます。 fromIndex > str.length の場合、fromIndex は str.length として扱われます。
大文字と小文字を区別します
lastIndexOf メソッドでは大文字と小文字が区別されます。たとえば、次の式は -1 を返します:
"Blue Whale, Killer Whale".lastIndexOf("blue"); // returns -1
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
"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
lastIndexOf の IE8 実装
ただし、Microsoft の IE8 以下は Array.lastIndexOf をサポートしていないため、互換性のある実装が必要です。参照できます:
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; }; }
for の使用を避けるべき理由
ただし、Array.prototype にメソッドを追加した後は、for in 構文で lastIndexOf メソッドも列挙されることに注意してください。
for (var idx in [1,3,5,7,9]) { console.log(idx) } >> 0 1 2 3 4 lastIndexOf
for (var idx = 0; idx < [1,3,5,7,9].length; idx++) { console.log(idx) }
Object.defineProperty(Array, "lastIndexOf", { enumerable: false })