之所以谈论一下这个api,是因为我以前在设计我自己的凤凰组件库的时候写过一个array的indexOf,然后我也写了一个JavaScript1.6新特性里面介绍的7个array扩展的api.所以回归到jQuery的源码再来看,可能就很简单了。
jQuery.inArray(value,array)
确认第一个参数在数组中的位置,从0开始计数(如果没有就返回-1)
- value ----------用于在数组中查找的项是否存在
- array ----------{Array}
源码展示:
/*@param elem 用于在数组中查找的项 @param array 待查找的数组 */ inArray: function(elem,array){ //判断浏览器是否支持javascript1.6新增的array原生的indexOf if(array.indexOf){ return array.indexOf(elem); } var i, len = array.length; //按照array的长度进行遍查找 for(i = 0,i<len;i++){ if(array[i] === elem ){ //如果array[i]的元素和elem相同 return i; } } //没有找到的话就返回-1 return -1; }
//简单测试一下 var arr = [0,1,2]; console.log($.inArray(0,arr)); //0 console.log($.inArray('a',arr)); //-1
总结一下:其实无论我们在编写自己的lib还是在一般的小项目里面,你如果看过hax的api设计讲座的话你会知道扩展Object.prototype的做法是不推荐的,或者尽量少用的。很多人在以前的项目里面自己在Array.prototype扩展了类似的indexOf,当然在IE8和以下的版本可能还是走你扩展的这个api,但是像ff等支持的高于JavaScript1.6版本以上的浏览器,它会去找原生的indexOf
而且个人觉得从代码优化角度来讲浏览器原生支持的似乎更快一点。如果你没有熟悉过JavaScript1.6等特性的新增情况也可以关注一下我后面推出的这个系列