javascript 的lastIndexOf

本文探讨了V8引擎中的整数转换函数及多种lastIndexOf方法的实现方式,包括Base2、Prototype1.61及火狐官方版本,并提供了一个高性能的精简版实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日收集上万行代码,整理一些出来。


//V8引擎的实现
      function ToInteger( n ) {
        n = Number( n );
        var sign = ( n < 0 ) ? -1 : 1;
        if ( n != n ) {
          return 0;
        }
        if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY ) {
          return n;
        }
        return ( sign * Math.floor(Math.abs(n)) );
      };

      function lastIndexOf= (array,element, index) {
        var length = array.length;
        if (index == null) {
          index = length - 1;
        } else {
          index = ToInteger(index);
          // If index is negative, index from end of the array.
          if (index < 0) index = length + index;
          // If index is still negative, do not search the array.
          if (index < 0) index = -1;
          else if (index >= length) index = length - 1;
        }
        // Lookup through the array.
        for (var i = index; i >= 0; i--) {
          var current = array[i];
          if ((current !== undefined) || i in this) {
            if (current === element) return i;
          }
        }
        return -1;
      }

一个重大的误区是以为原生API都用C语言实现,其实不然,比如火狐与chrome等以速度著称的浏览器,基本的部分用C语言实现后,其他请高手搞定。毕竟用其他语言来模拟javascript很容易犯错,比如IE6。忘了,那东西是叫JScript。


//Base2的实现
    function lastIndexOf(array, item, fromIndex) {
      var length = array.length;
      if (fromIndex == null) {
        fromIndex = length - 1;
      } else if (fromIndex < 0) {
        fromIndex = Math.max(0, length + fromIndex);
      }
      for (var i = fromIndex; i >= 0; i--) {
        if (array[i] === item) return i;
      }
      return -1;
    }

//Prototype1.61的实现
  function lastIndexOf(array,item, i) {
    i = isNaN(i) ? array.length : (i < 0 ? array.length + i : i) + 1;
    var n = array.slice(0, i).reverse().indexOf(item);
    return (n < 0) ? n : i - n - 1;
  }

//火狐官网的
//https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/lastIndexOf
      if (!Array.prototype.lastIndexOf){
        Array.prototype.lastIndexOf = function(elt /*, from*/){
          var len = this.length;

          var from = Number(arguments[1]);
          if (isNaN(from)){
            from = len - 1;
          }else{
            from = (from < 0) ? Math.ceil(from) : Math.floor(from);
            if (from < 0)
              from += len;
            else if (from >= len)
              from = len - 1;
          }
          for (; from > -1; from--){
            if (from in this &&this[from] === elt)
              return from;
          }
          return -1;
        };
      }

我现在使用的是V8的精简版


    var lastIndexOf = function(item,fromIndex){
        var length = this.length;
        if(fromIndex == null){
          fromIndex = length -1;
        }else{
          if(fromIndex<0)fromIndex = length + fromIndex;
          if(fromIndex<0) fromIndex = -1;
          else if(fromIndex >= length) fromIndex = length -1;
        }
        for(var i=fromIndex;i>=0;i--){
          var current = this[i];
          if(!(typeof(current)==='undefined') || i in this){
            if(current === item) return i
          }
        }
        return -1
      }

它最得意之处,没有使用什么复杂的函数,如Number,Math.max等东西,单纯是分支结构与循环,速度相单之快~!因为在javascript的速度排行中,操作符的速度最快,其次是方法,最后是对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值