详解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的数组。