详解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 相关文章推荐
理解JSON:3分钟课程
Oct 28 Javascript
jQuery 选择器项目实例分析及实现代码
Dec 28 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
Jan 23 Javascript
javascript禁制后退键(Backspace)实例代码
Nov 15 Javascript
JavaScript异步编程Promise模式的6个特性
Apr 03 Javascript
javascript如何创建对象
Aug 29 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
Oct 25 Javascript
手机端转换rem适应
Apr 01 Javascript
Cookies 和 Session的详解及区别
Apr 21 Javascript
在node中如何使用 ES6
Apr 22 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
关于React动态加载路由处理的相关问题
Jan 07 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中对数据库操作的封装
2006/10/09 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
javascript之AJAX框架使用说明
2010/04/24 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
手写一个python迭代器过程详解
2019/08/27 Python
python的列表List求均值和中位数实例
2020/03/03 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
捷科时代的软件测试笔试题
2015/11/09 面试题
异步传递消息系统的作用
2016/05/01 面试题
历史系毕业生自荐信
2013/10/28 职场文书
中学生在校期间的自我评价分享
2013/11/13 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
人力资源作业细则
2014/03/03 职场文书
如何写好建议书
2014/03/13 职场文书
抵押贷款承诺书
2014/05/30 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
nginx之内存池的实现
2022/06/28 Servers