• 技术文章 >web前端 >js教程

    详解JavaScript中数组和字符串的lastIndexOf()方法使用_基础知识

    2016-05-16 15:10:55原创1089
    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") + "
    "); // 输出: 4 // 从正数第二个位置,搜索倒数第一个CD的位置 document.write(ar.lastIndexOf("cd", 2) + "
    "); // 输出: 1 // 从倒数第三个搜索最后一个ab的位置 document.write(ar.lastIndexOf("ab", -3) + "
    "); // 输出: 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的数组。

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:javascript实现PC网页里的拖拽效果_javascript技巧 下一篇:Node.js编写爬虫的基本思路及抓取百度图片的实例分享_node.js
    线上培训班

    相关文章推荐

    • 浅析Node.js+Winston库如何构建简单日志功能• 浅谈Angular父子组件间怎么进行通信• javascript怎么实现句子反转• Javascript怎么设置水印叠堆• JavaScript怎么实现定时关闭div

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网