Skip to content

Latest commit

 

History

History
123 lines (89 loc) · 2.97 KB

17.2.md

File metadata and controls

123 lines (89 loc) · 2.97 KB

17.2 新的数组原型方法

一些可以被用于数组实例的新方法

17.2.1 遍历数组

下面的方法可以帮助遍历数组:

Array.prototype.entries()
Array.prototype.keys()
Array.prototype.values()

上述各方法的返回的结果都是包含一组值的序列,但这些值并不是作为一个数组返回;它们通过迭代器被一个一个遍历出来。让我们来看一个例子。使用 Array.from() 把迭代器中的内容放入数组:

> Array.from(['a', 'b'].keys())
[ 0, 1 ]
> Array.from(['a', 'b'].values())
[ 'a', 'b' ]
> Array.from(['a', 'b'].entries())
[ [ 0, 'a' ],
  [ 1, 'b' ] ]

也可以使用展开操作符(...)将迭代器转换成数组:

> [...['a', 'b'].keys()]
[ 0, 1 ]

17.2.1.1 遍历 [index, element] 对

你可以结合 ECMAScript 6 的 for-of 循环与 entries() 方法去方便地遍历 [index, element] 对。

for (let [index, elem] of ['a', 'b'].entries()) {
    console.log(index, elem);
}

17.2.2 检索数组中的元素

Array.prototype.find(predicate, thisArg?)

返回数组中被回调函数判断为真的第一元素,如果没有该元素,则返回 undefined ,举例:

> [6, -5, 8].find(x => x < 0)
-5
> [6, 5, 8].find(x => x < 0)
undefined

Array.prototype.findIndex(predicate, thisArg?)

返回数组中被回调函数判断为真的第一个元素的索引,如果没有该元素,则返回-1。举例:

> [6, -5, 8].findIndex(x => x < 0)
1
> [6, 5, 8].findIndex(x => x < 0)
-1

回调函数的完整写法:

predicate(element, index, array)

17.2.2.1 findIndex() 方法将数组中的空缺(holes)作为 undefined 元素处理

findIndex() 方法将数组中的空缺(holes)作为 undefined 元素处理(使用 find(),你将无法告诉它是否存在,因为如果它不能找到任何东西,它将返回 undefined ):

> ['a',,'c'].findIndex(x => x === undefined)
1

17.2.2.2 通过 findIndex() 方法寻找 NaN

Array.prototype.indexOf() 的一个众所周知的局限性在于它无法找到NaN的,因为通过===对元素进行搜索:

> [NaN].indexOf(NaN)
-1

findIndex() 方法一起,你可以使用 Object.is() 方法(在面向对象的章节解释),它没有这样的问题:

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

你也可以采用更通用的方法,通过创建一个辅助函数的 elemIs()

> function elemIs(x) { return Object.is.bind(Object, x) }
> [NaN].findIndex(elemIs(NaN))
0

17.2.3 Array.prototype.fill(value, start?, end?)

用给定的值填充数组:

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

数组中的空缺(holes)不会被特殊处理:

> new Array(3).fill(7)
[ 7, 7, 7 ]

你可以限定填充范围(起始和结束):

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