详解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:
"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
同样 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实现
不过微软的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; }; }
可以使用 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
而应该使用 for loop实现
for (var idx = 0; idx < [1,3,5,7,9].length; idx++) { console.log(idx) }
这个问题可以使用 object.defineproperty 来实现,来避免for in的枚举出lastindexof方法:
object.defineproperty(array, "lastindexof", { enumerable: false })
不过一般需要兼容实现的浏览器根本不支持defineproperty 方法。并且在多数浏览器上for in都比for loop要慢很多,因此应该尽量避免使用for in。但是如何枚举object属性的key呢? 使用object.keys({ a:1 })即可返回关于keys的数组。