2012-08-13 64 views
4

,Array实例有两个方法,数组的lastIndexOf返回-1时开始未定义在javascript

[].indexOf(searchvalue [,start]) 

[].lastIndexOf(searchvalue [,start]) 

是行为古怪,如果 “开始” 参数未定义:

[1,2,3].lastIndexOf(2) // 1 
[1,2,3].lastIndexOf(2,undefined) // -1 
[1,2,3].indexOf(2,undefined) // 1 

这种情况发生在chrome和firefox中,那么indexOf和lastIndexOf的理论是什么? Ÿ

回答

4
array.lastIndexOf(searchElement[, fromIndex]) 

的fromIndex处开始向后搜索的索引。数组的长度默认为 ,即整个数组将被搜索。如果 索引大于或等于数组的长度,则将搜索整个 数组。如果为负,则将其作为数组末尾的 的偏移量。请注意,即使索引为负数, 阵列仍然从后到前搜索。如果计算的索引是 小于0,则返回-1,即不搜索该数组。

[1,2,3].lastIndexOf(2,undefined)[1,2,3].lastIndexOf(2, 0)相同,所以只搜索第一个元素。

[1,2,3].lastIndexOf(2, 0)将返回-1

[1,2,3].lastIndexOf(1, 0)将返回0

+0

这是正确的,但为什么当的fromIndex是“undfined”,它也返回-1 – 2012-08-13 06:16:06

+0

从一位疯狂的阿拉伯学者的作品引用,这位阿拉伯学者的名字太有名了,不值得信任? – katspaugh 2012-08-13 06:21:08

+0

@GuanYuxin - 它返回-1,因为lastIndexOf通过数组向后*搜索。如果from参数未定义,它将在第一个元素处开始搜索,该元素的值为1。 – 2012-08-13 06:23:26

-1

这是Array lastIndexOf的标准实现。 Javascript Array lastIndexOf() Method

需要注意的是:

var from = Number(arguments[1]); 
if (isNaN(from)) 
{ 
    from = len - 1; 
} 
else 
{ 
    from = (from < 0) 
     ? Math.ceil(from) 
     : Math.floor(from); 
    if (from < 0) 
    from += len; 
    else if (from >= len) 
    from = len - 1; 
} 

我最初认为from等于0,但实际上它是NaN。 一个可能的结论是,Mozilla或WebKit的执行是不是你想要的

Another link-Javascript Array indexOf() Method

你可以看到它直接使用

var from = Number(arguments[1]) || 0; 
2

array.indexOf()在指定点开始测试,然后继续前进直到找到与指定值匹配的数组元素。因此,当你使用[1,2,3].indexOf(2,undefined),它开始在数组索引0处(其undefined被转换成),并进行到测试每个元素:

2 == 1 // false 
2 == 2 // true, returns index 1 

array.lastIndexOf(),但是,开始从指定的向后测试点。因此,当你使用[1,2,3].lastIndexOf(2,undefined),使用Javascript起始于具有索引0的数组元素,然后试图向后继续:

2 == 1 // false, no more elements to test, return -1