详解JavaScript中数组和字符串的lastIndexOf()方法使用
Array.prototype.lastIndexOf和String.prototype.lastIndexOf是非常的实用的方法,不过很多人不知道它其实可以传递两个参数,第二个参数决定了搜索的起始位置:
语法
str.lastIndexOf(searchValue[,fromIndex])
lastIndexOf()方法返回指定值在调用该方法的字符串中最后出现的位置,如果没找到则返回-1。从该字符串的后面向前查找,从fromIndex处开始。
参数
1.searchValue
一个字符串,表示被查找的值。
2.fromIndex
从调用该方法字符串的此位置处开始查找。可以是任意整数。默认值为str.length。如果为负值,则被看作0。如果fromIndex>str.length,则fromIndex被看作str.length。
区分大小写
lastIndexOf方法区分大小写。例如,下面的表达式返回-1:
"BlueWhale,KillerWhale".lastIndexOf("blue");//returns-1
lastIndexOf的用法
//Createanarray. varar=["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
同样String.lastIndexOf的用法类似
"canal".lastIndexOf("a")//returns3 "canal".lastIndexOf("a",2)//returns1 "canal".lastIndexOf("a",0)//returns-1从第0个往前搜,不存在'a',返回-1 "canal".lastIndexOf("x")//returns-1
lastIndexOf的IE8实现
不过微软的IE8及其以下并不支持Array.lastIndexOf,需要兼容实现。可以参考:
if(!Array.prototype.lastIndexOf){ Array.prototype.lastIndexOf=function(searchElement/*,fromIndex*/){ 'usestrict'; if(this===void0||this===null){ thrownewTypeError(); } varn,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; } elseif(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(kint&&t[k]===searchElement){ returnk; } } return-1; }; }
可以使用ES5-Slim使旧版浏览器完全兼容ES5语法。
为什么要避免使用forin
不过要注意的是,在Array.prototype上面附加方法后,forin语法也会把lastIndexOf方法也枚举出来:
for(varidxin[1,3,5,7,9]){ console.log(idx) } >>01234lastIndexOf
而应该使用forloop实现
for(varidx=0;idx<[1,3,5,7,9].length;idx++){ console.log(idx) }
这个问题可以使用Object.defineProperty来实现,来避免forin的枚举出lastIndexOf方法:
Object.defineProperty(Array,"lastIndexOf",{enumerable:false})
不过一般需要兼容实现的浏览器根本不支持defineProperty方法。并且在多数浏览器上forin都比forloop要慢很多,因此应该尽量避免使用forin。但是如何枚举Object属性的key呢?使用Object.keys({a:1})即可返回关于keys的数组。