JavaScript数组的indexOf()方法

最近写个小demo的时候需要求数组中某一元素的下标,首先就想到了Array的indexOf()方法,但是要注意的是indexOf()方法在IE里有不支持的情况,仅有IE9以上的版本(含IE9)支持。为照顾那些顽固不化的老东西,那就自己写个扩展呗。想着用遍历比较方便,就这么写了。

?View Code JAVASCRIPT
 
if(!Array.prototype.indexOf) {
	Array.prototype.indexOf = function(elt) {
		for(var i = 0,j = this.length; i < j; i++) {
			if(this[i] === elt) {
				return i;
			}
		}
		return -1;	
	}
}


当时为了实现我想要的效果,也没考虑太多,这么写其实也没错,只是并不是完整的indexOf()。完整功能的indexOf()应该可以传递两个参数,一个是被查找的那个元素,这是必须的。另外一个是下标,代表着从哪个位置开始查找,这个可选的。有时候我们并不需要从数组第一个元素开始查找。还有需要注意的是当第二个参数为负值的时候,JavaScript会自动为其做运算。

其最终值为数组的长度+这个赋值所得的结果。举几个例子:

?View Code JAVASCRIPT
 
var arr = [0,1,2,3,4];
console.log(arr.indexOf(3));	//结果3,不加第二个参数默认从头开始查找
console.log(arr.index(3,1));	//结果3,从下标为3的那个元素起开始查找
console.log(arr.indexOf(3,-1)); 
//结果-1,第二个参数为-1,最终值为总长度5+(-1) = 4,
//从第四个下标开始找,显然找不到数字3,所以返回-1。

这时候我们还需要考虑第二个参数有可能是浮点数。那indexOf()方法如何转换小数呢?这里直接讲解了,有兴趣的可以自己尝试,当为正浮点数的时候,例如1.4、2.3等,它会自动转换成1和2,也就是他会被转换成比他小的最近的那个整数,更简单的说就是会直接忽略掉小数点后面的位数,其实也就是进行了Math.floor()转换。当为负浮点数的时候,例如-1.4、-2.3,他会自动转换成-1、-2,转换成比他数值大的最近的那个整数,也就是进行了Math.ceil()转换。

?View Code JAVASCRIPT
 
arr.indexOf(3,1.2) --> arr.indexOf(3,1)
arr.indexOf(3,-1.2) --> arr.indexOf(3,-1)

知道了这些其实就可以写了。其实网上流传着一个很不错的版本,直接分享给大家就好了。参照我上面的讲解,很容易理解。

?View Code JAVASCRIPT
 
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(elt /*, from*/){
    var len = this.length;
    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0) {
    	from += len;
    }
    for (; from < len; from++){
      if (from in this && this[from] === elt)
        return from;
    }
    return -1;
  };
}

足够详尽,我也不狗尾续貂了。