测试代码1:
//indexOf原生方法:indexOf(特定的元素,开始下标);总结:indexOf如果第二个参数是负数表示从倒数第几个开始查找,如果第二个参数的负数加上数组长度仍然小于0那么就会搜索整个数组!
//同时indexOf的第二个参数可以是负数,表示从倒数第几个开始,记住,此时不是看下标,而是看倒数第几个!
var array = [2, 5, 9];
array.indexOf(9, -1); // 2
array.indexOf(2, -3); // 0
//如果第二个参数是负数,同时该负数加上数组长度依然小于0,那么就会搜索整个数组,也就是从0开始搜索数组
测试代码2:
//(i in arr)判断是为了跳过稀疏数组中的元素,如果i in arr判断为假,那么直接返回false了,否则才判断arr[i]===elem
// 例如 var arr = []; arr[2] = 1;
// 此时 arr == [undefined, undefined, 1]
// 结果是 => (0 in arr == false) (1 in arr == false) (2 in arr == true)
总结:in判断会跳过稀疏数组中的空白!
inArray源码分析:var deletedIds = [];
var indexOf = deletedIds.indexOf;
inArray: function( elem, arr, i ) {
var len;
if ( arr ) {
if ( indexOf ) {
return indexOf.call( arr, elem, i );
}
len = arr.length;
//alert($.inArray(5,[1,2,3,5,4],-1))这里获取到的i就是4,len就是5,返回值为-1
i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
for ( ; i < len; i++ ) {
// Skip accessing in sparse arrays
//这里直接跳过稀疏数组中的空白部分,进而节约时间
if ( i in arr && arr[ i ] === elem ) {
return i;
}
}
}
return -1;
}
总结:
(1)如果没有传入第三个参数,那么i为0表示从头开始查找;如果传入了第三个参数同时i<0那么取max(0,length+i),也就是和indexOf的逻辑是一样的(传入负数后加上长度还是小于0那么就从头开始查找!)
(2)JS原生的indexOf可以传入第二个参数表示开始查找的下标,如果该下标是负数那么取max(0,i+length)来表示从那里开始查找!
(3)要注意JS中的稀疏数组,在通过原生的forEach遍历的时候也会跳过其中的空格元素,所以这里的inArray方法也实现了跳过稀疏数组中元素!通过判断i in arr判断是否是用户主动设置了该元素!