[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` 适用于字符串,不适合字符。Isn’t that inconsistent w.r.t. Array.prototype.includes? 如果数组的 `includes` 与 字符串的 `includes` 完全相同,则它将接受数组,而不是单个元素。 这两个 `includes` 遵循 `indexOf`的例子;字符(characters)被视为特殊情况,任意长度的字符串被视为一般情况。 ## 3.4 进一步阅读 [`Array.prototype.includes`](https://github.com/tc39/Array.prototype.includes/) (Domenic Denicola,Rick Waldron)