近日收集上万行代码,整理一些出来。
//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的速度排行中,操作符的速度最快,其次是方法,最后是对象。