str.indexOf(searchValue [,fromIndex])
第一次出现searchValue的索引,或 -1,如果找不到。
为什么-1
被选为.indexOf
的返回值,如果它在数组中找不到匹配项?
console.log([].indexOf()) // -> -1
让0
改为更合适吗?这是有道理的,因为确实存在0
匹配元素。这样我们就可以直接在条件语句中使用它,例如:
if( Array.indexOf(String) ) { ... }
而不是
if( Array.indexOf(String) !== -1 ) { ... }
为什么?任何特殊原因?我在Java,C ++和C中也看到过相同的问题。这是因为原生函数是如何设计的?
答案 0 :(得分:3)
不是更适合拥有0吗?
没有。索引从零开始。
var str = "ABC";
console.log(str[0]);
console.log(str.indexOf("A"));
(对于数组也是如此,尽管引用了字符串文档,但您在示例中使用了这些数据)。
答案 1 :(得分:3)
好。关于为什么,它非常直截了当。 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)
会返回它的位置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
。