此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
Array.prototype.findLast()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2022年8月.
findLast() 方法反向迭代数组,并返回满足提供的测试函数的第一个元素的值。如果没有找到对应元素,则返回undefined。
如果你需要找到:
- 第一个匹配的元素,使用
find()。 - 数组中最后一个匹配元素的索引,使用
findLastIndex()。 - 某个值的索引,使用
indexOf()。(它类似于findIndex(),但是会检查每个元素是否与值相等,而不是使用一个测试函数。) - 该数组中是否存在一个值,使用
includes()。同样地,它检查每个元素是否和值相等,而不是使用一个测试函数。 - 是否有任意一个元素满足提供的测试函数,使用
some()。
In this article
尝试一下
const array1 = [5, 12, 50, 130, 44];const found = array1.findLast((element) => element > 45);console.log(found);// Expected output: 130语法
findLast(callbackFn)findLast(callbackFn, thisArg)参数
返回值
数组中满足提供的测试函数索引最高的元素;如果没有元素匹配,返回undefined。
描述
findLast() 是一个迭代方法。该方法对数组每一个元素按降序(索引从大到小)执行callbackFn 函数,直到callbackFn 返回一个真值。然后findLast() 返回该元素的值并停止遍历数组。如果callbackFn 没有返回一个真值,则findLast() 返回undefined。
callbackFn 会被数组中的每个元素调用,而不仅仅是那些被赋值的元素。对于稀疏数组来说,空槽行为和undefined 相同。
findLast() 方法不会改变调用它的数组,但是提供的callbackFn 可以。但是请注意,数组的长度是在第一次调用callbackFn之前保存的。因此:
callbackFn不会访问在调用findLast()开始后才添加到数组中的任何元素。- 给已访问过的索引重新赋值将不会被
callbackFn重新访问。 - 如果
callbackFn更改了数组中现有的、尚未访问的元素,则其传递给callbackFn的值将是findLast()访问该元素索引时的值。已删除的元素会被当做undefined来访问。
警告:上一段描述的并发修改的情况经常导致难以理解的代码,通常应该避免(特殊情况除外)。
findLast() 方法是通用的。它只期望this 值具有length 属性和整数键的属性。
示例
>查找与元素属性匹配的数组中的最后一个对象
此示例展示了如何根据数组元素的属性创建测试。
const inventory = [ { name: "apples", quantity: 2 }, { name: "bananas", quantity: 0 }, { name: "fish", quantity: 1 }, { name: "cherries", quantity: 5 },];// 库存低时返回 truefunction isNotEnough(item) { return item.quantity < 2;}console.log(inventory.findLast(isNotEnough));// { name: "fish", quantity: 1 }使用箭头函数和解构
前面的示例可以使用箭头函数和对象解构重写如下:
const inventory = [ { name: "apples", quantity: 2 }, { name: "bananas", quantity: 0 }, { name: "fish", quantity: 1 }, { name: "cherries", quantity: 5 },];const result = inventory.findLast(({ quantity }) => quantity < 2);console.log(result);// { name: "fish", quantity: 1 }查找数组中的最后一个素数
以下示例查找数组中的最后一个素数元素(如果没有素数,则返回undefined):
function isPrime(n) { if (n < 2) { return false; } if (n % 2 === 0) { return n === 2; } for (let factor = 3; factor * factor <= n; factor += 2) { if (n % factor === 0) { return false; } } return true;}console.log([4, 6, 8, 12].findLast(isPrime)); // undefined,没有找到console.log([4, 5, 7, 8, 9, 11, 12].findLast(isPrime)); // 11备注:isPrime() 实现仅供演示。在实际应用中,为了避免重复计算,会使用大量记忆化的算法,例如埃拉托斯特尼筛法。
在稀疏数组上使用 findLast()
稀疏数组中的空槽被访问,并被视为undefined。
// 声明一个在索引 2、3 和 4 处没有元素的数组const array = [0, 1, , , , 5, 6];// 显示所有的索引(不只包括那些被赋值的)array.findLast((value, index) => { console.log(`访问索引 ${index},值为 ${value}`);});// 访问索引 6,值为 6// 访问索引 5,值为 5// 访问索引 4,值为 undefined// 访问索引 3,值为 undefined// 访问索引 2,值为 undefined// 访问索引 1,值为 1// 访问索引 0,值为 0// 显示所有的索引(包括已被删除的)array.findLast((value, index) => { // 在第一次迭代时删除值为 5 的元素 if (index === 6) { console.log(`删除值为 array[5],其值为 ${array[5]}`); delete array[5]; } // 元素 5 在被删除后,仍会被访问 console.log(`访问索引 ${index},值为 ${value}`);});// 删除值为 array[5],其值为 5// 访问索引 6,值为 6// 访问索引 5,值为 undefined// 访问索引 4,值为 undefined// 访问索引 3,值为 undefined// 访问索引 2,值为 undefined// 访问索引 1,值为 1// 访问索引 0,值为 0在非数组对象上调用 findLast()
findLast() 方法读取this 的length 属性,然后访问每个整数索引。
const arrayLike = { length: 3, 0: 2, 1: 7.3, 2: 4,};console.log( Array.prototype.findLast.call(arrayLike, (x) => Number.isInteger(x)),); // 4规范
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-array.prototype.findlast> |