Array.prototype.indexOf的解释

给JavaScript中的Array加上了一个indexOf方法以支持IE。
这段代码没有问题,但是每行看得都不是特别懂,麻烦谁能给解释一下呢?

[code="java"]if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
//alert("prototyping...");
i || (i = 0);
var length = this.length;
if (i < 0) i = length + i;
for (; i < length; i++)
if (this[i] === item) return i;
return -1;
};

[/code]

[code="java"]
参数item:必选项,要查找的Array对象中的一子项
参数i:可选项。该整数值指出在 Array对象内开始查找的索引。如果省略,则从字符串的开始处查找。

if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
//alert("prototyping...");
//因为"||"或运算符是短路运算,就是当左边为true时不会去执行右边,直接就返回true,只有当左边为false时才会执行,也就是说除非以下情况才会执行i=0;
1.没有给indexOf传递参数i,比如array.indexOf(item);

2.i = 0、空字符串("")、undefined、null、NaN、false

i || (i = 0);
//这行显然就是得到数组的长度 var length = this.length;
//如果传的i<0,那么查找位置就从 length + i开始查找,这里其实还要做个判断,i不能小于-length;不然i = length + i;还是小于0
if (i < 0) i = length + i;
//这里就是从i位置开始查找item for (; i < length; i++)
//找到就返回item在Array中的位置
if (this[i] === item) return i;
//找不到就返回-1 return -1;
};

[/code]

JavaScript的条件表达式中,0、空字符串("")、undefined、null、NaN、false都表示假。
IE中Array类没有定义indexOf这么个方法,Array.prototype.indexOf返回undefined,!undefined相当于!false,也就是true。也就是说,给Array.prototype.indexOf赋值的语句只有在IE中会执行。
Array.prototype.indexOf = function(item, i){}是给Array类添加indexOf这么个方法。
方法中第一行代码的意思是,如果i为假(即没有给indexOf传递i这么个参数,i为undefined,也就是“假”),就给i赋值为0。
后面的算法不难懂吧?