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


Posted in Javascript onMarch 13, 2016

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

Javascript 相关文章推荐
使用JS操作页面表格,元素的一些技巧
Feb 02 Javascript
javascript 运算数的求值顺序
Aug 23 Javascript
javascript 获取HTML DOM父、子、临近节点
Jun 16 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
Mar 01 Javascript
基于Javascript实现文件实时加载进度的方法
Oct 12 Javascript
JS实现无缝循环marquee滚动效果
May 22 Javascript
IntersectionObserver实现图片懒加载的示例
Sep 29 Javascript
Vue如何从1.0迁移到2.0
Oct 19 Javascript
微信小程序slider组件使用详解
Jan 31 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
Jun 24 Javascript
如何在Vue中抽离接口配置文件
Oct 31 Javascript
js实现轮播图特效
May 28 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
Mar 12 #Javascript
JavaScript中循环遍历Array与Map的方法小结
Mar 12 #Javascript
Node.js的Express框架使用上手指南
Mar 12 #Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
Mar 11 #Javascript
JavaScript操作HTML DOM节点的基础教程
Mar 11 #Javascript
举例说明JavaScript中的实例对象与原型对象
Mar 11 #Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
Mar 11 #Javascript
You might like
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
纯js实现背景图片切换效果代码
2010/11/14 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
对Python中range()函数和list的比较
2018/04/19 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
365 Tickets英国:全球景点门票
2019/07/06 全球购物
python re模块和正则表达式
2021/03/24 Python
哈弗商学院毕业生求职信
2014/02/26 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
求职信标题怎么写
2014/05/26 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
安全教育的主题班会
2015/08/13 职场文书
redis 存储对象的方法对比分析
2021/08/02 Redis
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技