OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

Array及String的lastIndexOf函数用法及其IE8实现,及为什么要尽量避免使用for in


分享到
分类 JS学习   关键字 JavaScript   发布 kris  1454642901926
注意 转载须保留原文链接,译文链接,作者译者等信息。  
Array.prototype.lastIndexOf 和 String.prototype.lastIndexOf 是非常的实用一个函数,不过很多人不知道它其实可以传递两个参数,第二个参数决定了搜索的起始位置:

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


相关: 
for in 比for loop慢至少20倍



参考: 
https://msdn.microsoft.com/library/ff679972(v=vs.94).aspx
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf


社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 轻量级的可调视图和面板分栏Layout布局工具[开源]
  2. 八张图告诉你什么是大数据
  3. NodeJS将有望使用微软的ChakraCore JavaScript引擎驱动
  4. 什么是Spark,如何使用Spark进行数据分析
  5. 使用Node.js操作跨平台数据库Firebird
  6. 改变手机浏览器(iPhone/Android)上文本输入框的默认弹出键盘(数字)
  7. 用HTML5原生实现拖放或排序
  8. 如何用CSS将select/option文本居中或居右对齐
  9. ASP.NET 开发人员不必担心 Node 的五大理由
  10. Express入门教程:一个简单的博客
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. Express入门教程:一个简单的博客
  2. 用HTML5原生实现拖放或排序
  3. 如何用CSS将select/option文本居中或居右对齐
  4. 改变手机浏览器(iPhone/Android)上文本输入框的默认弹出键盘(数字)
  5. 掌握Node.js的文件系统[File System 基础]
  6. JavaScript也有getter/setter方法:ES5 Object对象的5个不为人知的特性
  7. ES6中的Map与JSON的相互转化(序列和持久化)
  8. 用jQuery和JavaScript深度复制JSON对象的方法
  9. Node.js中的通用基础设计模式
  10. WowJS:在滚动页面时添加动画效果的简单实现

 关键字 - JavaScript
  1. Node.JS更改Windows注册表regedit的几种方法
  2. AngularJS在大型单页面应用中的性能优化(二)
  3. WebPack:更优秀的模块依赖管理工具,及require.js的缺陷
  4. Debian下设置Linux Shell脚本开机自动启动Node.JS进程
  5. Node.JS通过原型和类继承EventEmitter,实现收发事件的几种方法
  6. NodeBots-JavaScript在智能设备驱动(物联网)中的崛起
  7. JavaScript的设计缺陷?浮点运算:0.1 + 0.2 != 0.3
  8. 少年,不要滥用箭头函数啊:JS中lambda表达式的优缺点和使用场景
  9. 可视化Web报表OnceVI中用户输入表单验证与提交
  10. 如何基于SVG矢量图制作一个可填写信息的可视化表单-OnceVI

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号