Array.prototype.lastIndexOf dan String.prototype.lastIndexOf adalah kaedah yang sangat praktikal, tetapi ramai orang tidak tahu bahawa mereka sebenarnya boleh melepasi dua parameter Parameter kedua menentukan kedudukan permulaan carian:
Tatabahasa
str.lastIndexOf(searchValue[, fromIndex])
Kaedah lastIndexOf() mengembalikan kejadian terakhir nilai yang ditentukan dalam rentetan yang memanggil kaedah ini, atau -1 jika tidak ditemui. Cari ke hadapan dari hujung rentetan, bermula dari dariIndex.
Parameter
1.searchValue
Rentetan yang mewakili nilai yang akan ditemui.
2.dariIndeks
Mulakan carian pada kedudukan dalam rentetan di mana kaedah itu dipanggil. Boleh jadi sebarang integer. Nilai lalai ialah str.length. Jika negatif, ia dianggap sebagai 0. Jika fromIndex > str.length, maka fromIndex dianggap sebagai str.length.
Sensitif huruf besar/kecil
kaedah lastIndexOf adalah sensitif huruf besar-besaran. Sebagai contoh, ungkapan berikut mengembalikan -1:
"Blue Whale, Killer Whale".lastIndexOf("blue"); // returns -1
Penggunaan 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
Penggunaan String.lastIndexOf adalah serupa
"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
Pelaksanaan IE8 lastIndexOf
Walau bagaimanapun, IE8 Microsoft dan ke bawah tidak menyokong Array.lastIndexOf, dan pelaksanaan yang serasi diperlukan. Anda boleh rujuk:
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; }; }
Anda boleh menggunakan ES5-Slim untuk menjadikan pelayar lama serasi sepenuhnya dengan sintaks ES5.
Mengapa anda harus mengelak menggunakan untuk dalam
Walau bagaimanapun, perlu diingat bahawa selepas menambah kaedah pada Array.prototype, sintaks for dalam juga akan menghitung kaedah lastIndexOf:
for (var idx in [1,3,5,7,9]) { console.log(idx) } >> 0 1 2 3 4 lastIndexOf
Anda harus menggunakan gelung sebaliknya
for (var idx = 0; idx < [1,3,5,7,9].length; idx++) { console.log(idx) }
Masalah ini boleh dilaksanakan menggunakan Object.defineProperty untuk mengelakkan kaedah lastIndexOf untuk dalam penghitungan:
Object.defineProperty(Array, "lastIndexOf", { enumerable: false })
Walau bagaimanapun, penyemak imbas yang biasanya memerlukan pelaksanaan yang serasi tidak menyokong kaedah defineProperty sama sekali. Dan dalam kebanyakan penyemak imbas, kerana dalam adalah lebih perlahan daripada gelung, jadi anda harus cuba mengelak daripada menggunakan untuk masuk. Tetapi bagaimana untuk menghitung kunci sifat Objek? Gunakan Object.keys({ a:1 }) untuk mengembalikan tatasusunan kunci.