詳解JavaScript中數(shù)組和字符串的lastIndexOf()方法使用
Array.prototype.lastIndexOf 和 String.prototype.lastIndexOf 是非常的實(shí)用的方法,不過很多人不知道它其實(shí)可以傳遞兩個參數(shù),第二個參數(shù)決定了搜索的起始位置:
語法
str.lastIndexOf(searchValue[, fromIndex])
lastIndexOf() 方法返回指定值在調(diào)用該方法的字符串中最后出現(xiàn)的位置,如果沒找到則返回 -1。從該字符串的后面向前查找,從 fromIndex 處開始。
參數(shù)
1.searchValue
一個字符串,表示被查找的值。
2.fromIndex
從調(diào)用該方法字符串的此位置處開始查找。可以是任意整數(shù)。默認(rèn)值為 str.length。如果為負(fù)值,則被看作 0。如果 fromIndex > str.length,則 fromIndex 被看作 str.length。
區(qū)分大小寫
lastIndexOf 方法區(qū)分大小寫。例如,下面的表達(dá)式返回 -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 // 從正數(shù)第二個位置,搜索倒數(shù)第一個CD的位置 document.write(ar.lastIndexOf("cd", 2) + "<br/>"); // 輸出: 1 // 從倒數(shù)第三個搜索最后一個ab的位置 document.write(ar.lastIndexOf("ab", -3) + "<br/>"); // 輸出: 0
同樣 String.lastIndexOf的用法類似
"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實(shí)現(xiàn)
不過微軟的IE8及其以下并不支持Array.lastIndexOf,需要兼容實(shí)現(xiàn)??梢詤⒖迹?/p>
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; }; }
可以使用 ES5-Slim 使舊版瀏覽器完全兼容ES5語法。
為什么要避免使用for in
不過要注意的是,在Array.prototype上面附加方法后,for in語法也會把lastIndexOf方法也枚舉出來:
for (var idx in [1,3,5,7,9]) { console.log(idx) } >> 0 1 2 3 4 lastIndexOf
而應(yīng)該使用 for loop實(shí)現(xiàn)
for (var idx = 0; idx < [1,3,5,7,9].length; idx++) { console.log(idx) }
這個問題可以使用 Object.defineProperty 來實(shí)現(xiàn),來避免for in的枚舉出lastIndexOf方法:
Object.defineProperty(Array, "lastIndexOf", { enumerable: false })
不過一般需要兼容實(shí)現(xiàn)的瀏覽器根本不支持defineProperty 方法。并且在多數(shù)瀏覽器上for in都比for loop要慢很多,因此應(yīng)該盡量避免使用for in。但是如何枚舉Object屬性的key呢? 使用Object.keys({ a:1 })即可返回關(guān)于keys的數(shù)組。
相關(guān)文章
初學(xué)JS的的小例子 javascript replace高亮替換
初學(xué)JS的的小例子 javascript replace高亮替換...2007-12-12深入理解JavaScript系列(47):對象創(chuàng)建模式(上篇)
這篇文章主要介紹了深入理解JavaScript系列(47):對象創(chuàng)建模式(上篇),本文講解了命名空間、定義依賴、私有屬性和私有方法 、Revelation模式、鏈模式等內(nèi)容,需要的朋友可以參考下2015-03-03JavaScript中this用法學(xué)習(xí)筆記
在本篇文章里小編給大家分享了關(guān)于JavaScript中this用法學(xué)習(xí)筆記以及知識點(diǎn)總結(jié),有興趣的朋友們學(xué)習(xí)下。2019-03-03關(guān)于javascript中的parseInt使用技巧
前面好幾次遇到JavaScript中parseInt函數(shù)把字串轉(zhuǎn)為數(shù)字,前面遇到過幾次問題,然后就換其它方法進(jìn)行比較。2009-09-09JavaScript字符串對象replace方法實(shí)例(用于字符串替換或正則替換)
這篇文章主要介紹了JavaScript字符串對象replace方法實(shí)例,replace方法用于字符串替換,同時支持正則表達(dá)式替換,需要的朋友可以參考下2014-10-10