微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

详解JavaScript中数组和字符串的lastIndexOf()方法使用

Array.prototype.lastIndexOf 和 String.prototype.lastIndexOf 是非常的实用的方法,不过很多人不知道它其实可以传递两个参数,第二个参数决定了搜索的起始位置:

语法

rush:js;"> str.lastIndexOf(searchValue[,fromIndex])

lastIndexOf() 方法返回指定值在调用方法的字符串中最后出现的位置,如果没找到则返回 -1。从该字符串的后面向前查找,从 fromIndex 处开始。

参数

1.searchValue 一个字符串,表示被查找的值。 2.fromIndex 从调用方法字符串的此位置处开始查找。可以是任意整数。认值为 str.length。如果为负值,则被看作 0。如果 fromIndex > str.length,则 fromIndex 被看作 str.length。

区分大小写

lastIndexOf 方法区分大小写。例如,下面的表达式返回 -1:

rush:js;"> "Blue Whale,Killer Whale".lastIndexOf("blue"); // returns -1

lastIndexOf的用法

rush:js;"> // Create an array. var ar = ["ab","cd","ef","ab","cd"];

// 找到最后一个CD的位置
document.write(ar.lastIndexOf("cd") + "
");
// 输出: 4

// 从正数第二个位置,搜索倒数第一个CD的位置
document.write(ar.lastIndexOf("cd",2) + "
");
// 输出: 1

// 从倒数第三个搜索最后一个ab的位置
document.write(ar.lastIndexOf("ab",-3) + "
");
// 输出: 0

同样 String.lastIndexOf的用法类似

rush:js;"> "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 (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方法也枚举出来:

0 1 2 3 4 lastIndexOf

而应该使用 for loop实现

rush:js;"> for (var idx = 0; idx < [1,9].length; idx++) { console.log(idx) }

这个问题可以使用 Object.defineProperty 来实现,来避免for in的枚举出lastIndexOf方法

rush:js;"> Object.defineProperty(Array,"lastIndexOf",{ enumerable: false })

不过一般需要兼容实现的浏览器根本不支持defineProperty 方法。并且在多数浏览器上for in都比for loop要慢很多,因此应该尽量避免使用for in。但是如何枚举Object属性的key呢? 使用Object.keys({ a:1 })即可返回关于keys的数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐