YUI Array 之 indexOf(索引值|搜索)

YUI原码

function (array, value, from) { return Native.indexOf.call(array, value, from); } : function (array, value, from) { // http://es5.github.com/#x15.4.4.14 var len = array.length; from = +from || 0; from = (from > 0 || -1) * Math.floor(Math.abs(from));//取整 if (from < 0) { from += len; if (from < 0) { from = 0; } } for (; from < len; ++from) { if (from in array && array[from] === value) { return from; } } return -1; };

tangram – indexOf 原码

function(){ ///import baidu.array; baidu.array.extend({ indexOf : function (match, fromIndex) { baidu.check(".+(,number)?","baidu.array.indexOf"); var len = this.length; // 小于 0 (fromIndex = fromIndex | 0) < 0 && (fromIndex = Math.max(0, len + fromIndex)); for ( ; fromIndex < len; fromIndex++) { if(fromIndex in this && this[fromIndex] === match) { return fromIndex; } } return -1; } }); return baidu; }();


underscore原码

function(array, item, isSorted) { if (array == null) return -1; var i = 0, l = array.length; if (isSorted) { if (typeof isSorted == 'number') { i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted); } else { i = _.sortedIndex(array, item); return array[i] === item ? i : -1; } } if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); for (; i < l; i++) if (array[i] === item) return i; return -1; };

qwrap原码

function(arr, obj, fromIdx) { var len = arr.length; fromIdx |= 0; //取整 if (fromIdx < 0) { fromIdx += len; } if (fromIdx < 0) { fromIdx = 0; } for (; fromIdx < len; fromIdx++) { if (fromIdx in arr && arr[fromIdx] === obj) { return fromIdx; } } return -1; }

比较

1.不同在于几个对于起始位置的处理

     a.  YUI的处理看来来复杂,但是它是根据ES5中的标准步骤进行的 

     b.  underscore是唯一一个没用对起始值取整的且不支持负值,但它提供了对大数组提供二进制搜索的功能

     c. underscore针对null做了特殊处理,防止抛出错误,影响后续进行

     d. 比较之下,对于起始位置的处理,倾向于tangram的做法,简洁明了,充分利用了各种运算符的特性

      (fromIndex = fromIndex | 0 ) < 0  &&  (fromIndex = Math.max(0, len + fromIndex))