当start未定义时,Array的lastIndexOf返回-1。

4

在JavaScript中,数组实例有两个方法:

[].indexOf(searchvalue [,start])

并且

[].lastIndexOf(searchvalue [,start])

如果“start”参数未定义,则 is 函数的行为会变得奇怪:

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

这在Chrome和Firefox中发生,那么indexOf和lastIndexOf对待"undefined"的理论是什么?
3个回答

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


这是正确的,但为什么当 fromIndex 是 "undefined" 时,它也返回 -1 呢? - Guan Yuxin
引用一位名气太大而无需署名的疯狂阿拉伯学者的作品? - katspaugh
@GuanYuxin - 返回-1是因为lastIndexOf从数组的末尾开始搜索。如果未定义from参数,则从第一个元素开始搜索,其值为1。 - Dave R.

2

array.indexOf() 从指定点开始测试,然后继续向前直到找到与指定值匹配的数组元素。因此,当您使用 [1,2,3].indexOf(2,undefined) 时,它从索引为0的数组元素开始(将 undefined 转换为0),并继续测试每个元素:

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

-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的实现不是你想要的。

另一个链接-Javascript数组indexOf()方法

你可以直接看到它使用了

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接