如果找不到匹配,为什么indexOf返回-1?

时间:2018-06-15 11:05:25

标签: javascript indexof

  

str.indexOf(searchValue [,fromIndex])

     

第一次出现searchValue的索引,或 -1,如果找不到

     

- MDN web docs

为什么-1被选为.indexOf的返回值,如果它在数组中找不到匹配项?

console.log([].indexOf()) // -> -1

0改为更合适吗?这是有道理的,因为确实存在0匹配元素。这样我们就可以直接在条件语句中使用它,例如:

if( Array.indexOf(String) ) { ... }

而不是

if( Array.indexOf(String) !== -1 ) { ... }

为什么?任何特殊原因?我在Java,C ++和C中也看到过相同的问题。这是因为原生函数是如何设计的?

5 个答案:

答案 0 :(得分:3)

  

不是更适合拥有0吗?

没有。索引从零开始。

var str = "ABC";
console.log(str[0]);
console.log(str.indexOf("A"));

(对于数组也是如此,尽管引用了字符串文档,但您在示例中使用了这些数据)。

答案 1 :(得分:3)

好。关于为什么,它非常直截了当。 indexOf返回元素的位置,如果它不存在则返回。此外,所有(99%)编程语言都被0编入索引,或更好地说stringsarrays为0索引,这意味着第一个元素位于0位。

将位置视为数组开头的元素的offset。所以第一个元素距离数组开头的距离/偏移量是0:)

也许您正在寻找includes()来检查元素是否在数组中。

const arr=[1,2,3]
// classic
if (!arr.includes(4)) {
  console.log('4 does not exist (classic)')
}

// or short circuit

!arr.includes(4) && console.log('4 does not exist (short circuit)')

// conditional (ternary) operator

!arr.includes(4) ? console.log('4 does not exist (ternary)') : ""

<强>观察

此外,您不应将indexOf()用作布尔条件,例如

let arr=['a','b','c']

arr.indexOf('a') ? console.log('true') : console.log('false')

在上面的例子中,indexOf(a)会返回它的位置0。在布尔条件中,0被javaScript视为false。所以它不会给你预期的结果。

答案 2 :(得分:1)

其他人都在说同样的话,但让我尝试一下答案的另一种措辞。

在Javascript中,数组从元素0开始索引。因此,如果在开头找到的字符串qas的有效返回值将为0。如果将未找到的字符串报告为0,则不会知道是否在或找到该字符串。开始。 -1永远不是字符串中某个位置的有效值。

关于您的测试

if( Array.indexOf(String) ) { ... }

您可以改用

if( 1+Array.indexOf(String) ) { ... }

避免使用!== -1测试。

作为一般考虑,Array.indesOf()的结果是重载的。结果同时包含函数结果和错误代码。这种重载使函数调用可以直接在测试中使用。但是,请考虑一下,如果函数调用位于if语句中,则可能需要再次调用该函数,这会降低效率。如果在分配结果然后测试结果之前,您将在计算上更加高效。甚至没有内存成本,因为函数中的变量在堆栈上,如果将变量保留在本地,则在函数返回时清除。

返回包含成功/失败标志和结果的结构的函数是一种干净的方法,可以对可能失败的函数调用进行泛化,并且是放置异常处理而不使简单测试复杂化的便捷位置想做。

答案 3 :(得分:0)

因为在几乎所有编程语言中,0都是数组的第一个位置。

答案 4 :(得分:0)

indexOf()为您提供数组中元素的位置,数组的有效索引从0, 1, ...开始,依此类推,直到array.length-1,如果indexOf()将返回0对于非存在元素,那么这将是不正确的,因为0是一个有效的索引。因此使用了-1