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' ]