[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)