代码之家  ›  专栏  ›  技术社区  ›  Ivan Jeffrey Zhao

如果没有找到匹配项,indexof为什么返回-1?

  •  -5
  • Ivan Jeffrey Zhao  · 技术社区  · 6 年前

    str.indexof(searchValue[,fromIndex])

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

    - MDN web docs

    为什么是 -1 选择作为返回值 .indexOf 如果在数组中找不到匹配项?

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

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

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

    而不是

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

    为什么?有什么特别的原因吗?我在爪哇看到了同样的内容,C++和C.是因为原生函数是如何设计的吗?

    5 回复  |  直到 6 年前
        1
  •  3
  •   Mihai T    6 年前

    好。原因很直接。 indexOf 如果元素不存在,则返回该元素的位置。加上所有(99%)编程语言 0 索引,或者更好地说 strings arrays 索引为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) 返回它的位置 . 在布尔条件下 被javascript视为false。所以它不会给你预期的结果。

        2
  •  3
  •   Quentin    6 年前

    用0代替不是更合适吗?

    不,索引从零开始。

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

    (数组也是如此,尽管引用了字符串的文档,但仍将其用于示例)。

        3
  •  1
  •   kd4ttc    6 年前

    其他人都在说同样的话,但让我试着用另一种措辞来回答。

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

    至于你的测试

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

    你可以用

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

    以避免使用!==-1检验。

    一般来说,array.indesof()的结果是重载的。结果包含函数结果和错误代码。此重载允许在测试中直接使用函数调用。但是,请考虑,如果函数调用在if语句中,则可能需要再次调用该函数,这是效率损失。如果在if之前对结果进行赋值,然后测试结果,则计算效率会更高。甚至没有内存开销,因为函数中的变量在堆栈上,如果保持变量为局部变量,则在函数返回时清除堆栈。

    返回包含成功/失败标志和结果的结构的函数是一种简单的方法,可以泛化可能失败的函数调用,并且是一个方便的地方,可以在不复杂化要执行的简单测试的情况下进行异常处理。

        4
  •  0
  •   Luca Perico    6 年前

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

        5
  •  0
  •   Ankit Agarwal    6 年前

    indexOf() 给出元素在数组中的位置,数组的有效索引从 0, 1, ... 等等直到 array.length-1 所以如果 索引() 会回来 0 对于不存在的元素,那将是不正确的 是有效的索引。因此 -1 使用。