[TOC]
# 3. Array.prototype.includes
本章描述了 Domenic Denicola 和 Rick Waldron 提出的 ECMAScript 2016 的特性 `Array.prototype.includes`。
## 3.1 概述
```js
> ['a', 'b', 'c'].includes('a')
true
> ['a', 'b', 'c'].includes('d')
> false
```
## 3.2 Array的方法`includes`
数组方法 `includes` 展示如下:
```js
Array.prototype.includes(value : any) : boolean
```
如果 `value` 是其接收方的一个元素(`this`),则返回 true,否则返回 false :
```js
> ['a', 'b', 'c'].includes('a')
true
> ['a', 'b', 'c'].includes('d')
false
```
`includes` 类似于 `indexOf` - 以下两个表达式基本是等价的:
```js
arr.includes(x)
arr.indexOf(x) >= 0
```
主要区别在于 `includes()`查找 `NaN` ,而 `indexOf()`则不查找:
```js
> [NaN].includes(NaN)
true
> [NaN].indexOf(NaN)
-1
```
`includes` 不区分 `+0` 和`-0` ( [这几乎是所有 JavaScript 的工作原理](http://speakingjs.com/es5/ch11.html#two_zeros) ):
```js
> [-0].includes(+0)
true
```
类型数组(Typed Arrays)也有一个方法 `includes()`:
```js
let tarr = Uint8Array.of(12, 5, 3)
console.log(tarr.includes(5)) // true
```
## 3.3 常见问题
- 为什么方法被命名为 `includes` 而不是 `contains`?
最初的选择是 `contains`,但它破坏了 web 上的代码( [MooTools 将此方法添加到 Array.prototype](https://esdiscuss.org/topic/having-a-non-enumerable-array-prototype-contains-may-not-be-web-compatible) )。
- 为什么方法被命名为 `includes` 而不是 `has`?
`has` 用于键( Map.prototype.has ), `includes` 用于元素(`String.prototype.includes`)。集合的元素可以被视为键和值,这就是为什么有一个 `Set.prototype.has`(和没有 `includes`)。
- ES6 的 `String.prototype.includes` 适用于字符串,不适合字符。那不是自相矛盾吗?
如果数组的`includes`的工作方式与字符串的`includes`完全相同,那么它将接受数组,而不是单个元素。这两个 `includes` 遵循 `indexOf`的例子;字符(characters)被视为特殊情况,而任意长度的字符串被视为一般情况。
## 3.4 进一步阅读
[`Array.prototype.includes`](https://github.com/tc39/Array.prototype.includes/) (Domenic Denicola,Rick Waldron)