详解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 相关文章推荐
Javascript 日期对象Date扩展方法
May 30 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
Jul 31 Javascript
javascript判断机器是否联网的2种方法
Aug 09 Javascript
javascript获取所有同类checkbox选项(实例代码)
Nov 07 Javascript
学习Javascript面向对象编程之封装
Feb 23 Javascript
JavaScript知识点总结(十)之this关键字
May 31 Javascript
vue实现选项卡及选项卡切换效果
Apr 24 Javascript
详解微信小程序开发用户授权登陆
Apr 24 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
Aug 08 Javascript
解决VUEX的mapState/...mapState等取值问题
Jul 24 Javascript
vue elementui tree 任意级别拖拽功能代码
Aug 31 Javascript
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 Vue.js
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
海贼王:最美的悬赏令!
2020/03/02 日漫
PHP输出日历表代码实例
2015/03/27 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
python3中rank函数的用法
2019/11/27 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
在职研究生自我鉴定
2013/10/16 职场文书
毕业自我鉴定
2013/11/05 职场文书
毕业实习个人鉴定范文
2013/12/10 职场文书
预备党员思想汇报
2014/01/08 职场文书
禁毒宣传标语
2014/06/19 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
清洁员岗位职责
2015/02/15 职场文书
实习单位鉴定意见
2015/06/04 职场文书
Python中for后接else的语法使用
2021/05/18 Python
Apache自带的ab压力测试工具的实现
2022/07/23 Servers
Java使用HttpClient实现文件下载
2022/08/14 Java/Android