重温ES6系列之“数组的扩展-数组实例的find()、findIndex()、fill()、includes()”

一、find()

数组实例的find方法,用于找出第一个符合条件的数组成员。 它的参数是一个回调函数,全部数组成员依次执行该回调函数,直到找出第一个返回值算法

为true的成员,而后返回该成员。若是没有符合条件的成员,则返回undefined。数组

[1, 4, -5, 10].find((n) => n < 0)

// -5
复制代码

上面代码找出数组中第一个小于0的成员。markdown

[1, 5, 10, 15].find(function(value, index, arr) {

return value > 9;

}) // 10
复制代码

上面代码中,find方法的回调函数能够接受三个参数,依次为当前的值、当前的位置和原数组。数据结构

二、findIndex()

数组实例的findIndex方法的用法与find方法很是相似,返回第一个符合条件的数组成员的位置,若是全部成员都不符合条件,则返回-1。app

[1, 5, 10, 15].findIndex(function(value, index, arr) {

return value > 9;}) // 2
复制代码

这两个方法均可以接受第二个参数,用来绑定回调函数的this对象。ide

另外,这两个方法均可以发现NaN,弥补了数组的IndexOf方法的不足。函数

[NaN].indexOf(NaN)

// -1

[NaN].findIndex(y => Object.is(NaN, y))

// 0
复制代码

上面代码中,indexOf方法没法识别数组的NaN成员,可是findIndex方法能够借助Object.is方法作到ui

3.fill()

fill方法使用给定值,填充一个数组。this

['a', 'b', 'c'].fill(7)

// [7, 7, 7]

new Array(3).fill(7)

// [7, 7, 7]
复制代码

上面代码代表,fill方法用于空数组的初始化很是方便。数组中已有的元素,会被所有抹去。lua

fill方法还能够接受第二个和第三个参数,用于指定填充的起始位置和结束位置。

['a', 'b', 'c'].fill(7, 1, 2)

// ['a', 7, 'c']
复制代码

上面代码表示,fill方法从1号位开始,向原数组填充7,到2号位以前结束。

4.includes()

Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法相似。

[1, 2, 3].includes(2); // true

[1, 2, 3].includes(4); // false

[1, 2, NaN].includes(NaN); // true
复制代码

该方法的第二个参数表示搜索的起始位置,默认为0。若是第二个参数为负数,则表示倒数的位置,若是这时它大于数组长度(好比第二个参数为-4,但数组长度为3),则会重置为从0开始。

[1, 2, 3].includes(3, 3); // false

[1, 2, 3].includes(3, -1); // true
复制代码

没有该方法以前,咱们一般使用数组的indexOf方法,检查是否包含某个值。

if (arr.indexOf(el) !== -1) {

// ...

}
复制代码

indexOf方法有两个缺点:

  • 不够语义化,它的含义是找到参数值的第一个出现位置,因此要去比较是否不等于-1,表达起来不够直观。
  • 内部使用严格至关运算符(===)进行判断,这会致使对NaN的误判。
[NaN].indexOf(NaN)

// -1
复制代码

includes使用的是不同的判断算法,就没有这个问题。

[NaN].includes(NaN)

// true
复制代码

下面代码用来检查当前环境是否支持该方法,若是不支持,部署一个简易的替代版本。

const contains = (() =>

Array.prototype.includes

? (arr, value) => arr.includes(value)

: (arr, value) => arr.some(el => el === value)

)();

contains(["foo", "bar"], "baz"); // => false
复制代码

Map和Set数据结构有一个has方法,须要注意与includes区分。

Map结构的has方法,是用来查找键名的,好比Map.prototype.has(key)、WeakMap.prototype.has(key)、Reflect.has(target, propertyKey)。

Set结构的has方法,是用来查找值的,好比Set.prototype.has(value)、WeakSet.prototype.has(value)。

相关文章
相关标签/搜索