除了提高可读性之外,还有什么优势includes
吗indexOf
?他们似乎和我一模一样。
这有什么区别
var x = [1,2,3].indexOf(1) > -1; //true
和这个?
var y = [1,2,3].includes(1); //true
除了提高可读性之外,还有什么优势includes
吗indexOf
?他们似乎和我一模一样。
这有什么区别
var x = [1,2,3].indexOf(1) > -1; //true
和这个?
var y = [1,2,3].includes(1); //true
tl; dr: NaN
被区别对待:
[NaN].indexOf(NaN) > -1
是false
[NaN].includes(NaN)
是true
来自提案:
动机
使用 ECMAScript 数组时,通常需要确定数组是否包含元素。流行的模式是
if (arr.indexOf(el) !== -1) { ... }
具有各种其他可能性,例如
arr.indexOf(el) >= 0
,甚至~arr.indexOf(el)
。这些模式表现出两个问题:
- 他们没有“说出你的意思”:不是询问数组是否包含一个元素,而是询问该元素在数组中第一次出现的索引是什么,然后比较它或对它进行位旋转,以确定您实际问题的答案。
- 他们失败了
NaN
,因为indexOf
使用了严格的平等比较,因此[NaN].indexOf(NaN) === -1
。建议的解决方案
我们建议添加一种
Array.prototype.includes
方法,以便上述模式可以重写为if (arr.includes(el)) { ... }
这与上面的语义几乎相同,只是它使用 SameValueZero 比较算法而不是 Strict Equality Comparison,因此为
[NaN].includes(NaN)
真。因此,这个提议解决了现有代码中的两个问题。
为了保持一致性,我们还添加了一个
fromIndex
类似于Array.prototype.indexOf
and的参数。String.prototype.includes
更多信息:
NaN
使用时找不到indexOf
[NaN].indexOf(NaN) // => -1 (not found)
[NaN].includes(NaN) // => true
includes
如果您想知道在哪里找到元素的索引,也没有用。
arr.indexOf('blah') !== -1
可读性和可维护性较差。另一方面,按照arr.includes('blah')
它所说的去做,很明显它返回了一个boolean
.
根据这篇关于该主题的文章,虽然速度可能会慢一点,但没有明显的区别。includes
indexOf
以前创建的方式includes
。
.indexOf()
和.includes()
方法可用于搜索数组中的元素或搜索给定字符串中的字符/子字符串。
(链接到 ECMAScript 规范)
indexOf
使用严格相等比较,而includes
使用SameValueZero算法。因此,产生以下两点不同。
正如Felix Kling所指出的,在NaN
.
let arr = [NaN];
arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
undefined
。let arr = [ , , ];
arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true
(链接到 ECMAScript 规范)
1. 如果您将 RegExp 传递给indexOf
,它会将 RegExp 视为字符串,如果找到,将返回字符串的索引。但是,如果您将 RegExp 传递给includes
,它将引发异常。
let str = "javascript";
str.indexOf(/\w/); // returns -1 even though the elements match the regex because /\w/ is treated as string
str.includes(/\w/); // throws TypeError: First argument to String.prototype.includes must not be a regular expression
正如GLAND_PROPRE指出的那样,includes
可能比(因为它需要检查正则表达式作为第一个参数)慢一点(非常小),indexOf
但实际上,这并没有太大区别并且可以忽略不计。
String.prototype.includes()
在 ECMAScript 2015Array.prototype.includes()
中引入,而在 ECMAScript 2016 中引入。关于浏览器支持,请明智地使用它们。
String.prototype.indexOf()
并且Array.prototype.indexOf()
存在于 ECMAScript 的 ES5 版本中,因此受到所有浏览器的支持。
从概念上讲,当您想使用位置时,您应该使用 indexOf indexOf 只是让您提取值或对数组进行操作,即在获得元素位置后使用切片、移位或拆分。另一方面,使用 Array.includes 只知道值是否在数组内部而不是位置,因为您不关心它。
indexOf()
并且includes()
都可以用于查找数组中的元素,但是每个函数产生不同的返回值。
indexOf
返回一个数字(-1
如果数组中不存在元素,如果元素存在则返回数组位置)。
includes()
返回一个布尔值(true
或false
)。
Internet Explorer 不支持包含,如果这有助于您决定。
答案和例子都很棒。但是(乍一看),这让我误解includes
了true
使用undefined
.
因此,我包含了详细说明的示例,包括可用于检查未定义和 NaN 值,其中 indexOf不能
//Array without undefined values and without NaN values.
//includes will return false because there are no NaN and undefined values
const myarray = [1,2,3,4]
console.log(myarray.includes(undefined)) //returns false
console.log(myarray.includes(NaN)) //returns false
//Array with undefined values and Nan values.
//includes will find them and return true
const myarray2 = [1,NaN, ,4]
console.log(myarray2.includes(undefined)) //returns true
console.log(myarray2.includes(NaN)) //returns true
console.log(myarray2.indexOf(undefined) > -1) //returns false
console.log(myarray2.indexOf(NaN) > -1) //returns false
概括
includes
可用于检查数组中的未定义和 NaN 值indexOf
不能用于检查数组中的未定义和 NaN 值
let allGroceries = ['tomato', 'baked bean',];
//returns true or false
console.log(allGroceries.includes("tomato")); //uses boolean value to check
let fruits2 = ["apple", "banana", "orange"];
console.log(fruits2.includes("banana"));
// returns true because banana is in the array
//.indexOf returns the index of the value
console.log(allGroceries.indexOf("tomato"));//returns the index of the value
//returns -1 because tomato is not in the array
//fromIndex
console.log(allGroceries.indexOf("tomato", 2));
indexOf 是检查数组中是否有东西的旧方法,新方法更好,因为您不必为存在 (-1) 编写条件,这就是为什么使用返回您的 include() 方法的原因布尔值。
array.indexOf('something') // return index or -1
array.includes('something') // return true of false
因此,对于查找索引,第一种方法更好,但对于检查是否存在,第二种方法更有用。
包括使用自动类型转换,即在字符串和数字之间。indexOf 没有。