findlast 和 findlastindex 是 es2023 新增的反向查找方法,从数组末尾开始遍历,返回首个匹配元素或其原索引;不等价于 reverse().find() 或 filter().slice(-1),具高效性与语义准确性。

findLast 和 findLastIndex 是 ES2023 新增的数组方法,它们从数组末尾开始向前查找(即反向遍历),返回第一个匹配的元素或其索引,而不是像 find/findIndex 那样从开头找。
核心行为:从后往前,只找“第一个”匹配项
虽然叫“Last”,但它们不是找“最后一个匹配项”,而是从末尾开始遍历,一旦遇到满足条件的元素就立即返回——所以是“从后往前的第一个”。这和 arr.reverse().find(...) 有本质区别(后者会新建数组、改变顺序,且语义不同)。
-
findLast(callback):返回满足条件的元素值,没找到返回undefined -
findLastIndex(callback):返回满足条件的元素索引(原数组中的真实下标),没找到返回-1 - 回调函数签名与
find一致:(element, index, array) => boolean
实际用法示例
假设有一个数组:const nums = [1, 2, 3, 4, 5, 3, 2];
- 找最后一个偶数:
nums.findLast(x => x % 2 === 0)→4(索引为 3,不是最后出现的 2) - 找最后一个偶数的索引:
nums.findLastIndex(x => x % 2 === 0)→3 - 找值为
3的最后一项(即靠后的那个):nums.findLastIndex(x => x === 3)→5(因为索引 5 的 3 在索引 2 的 3 之后)
兼容性与降级方案
目前主流浏览器(Chrome 117+、Firefox 116+、Safari 17.4+)已支持,Node.js 20.6+ 原生可用。若需兼容旧环境:
- 可手动反向遍历:
for (let i = arr.length - 1; i >= 0; i--) { if (callback(arr[i], i, arr)) return ... } - 或使用 polyfill(如 core-js 提供)
- 避免用
arr.slice().reverse().find():性能差(复制+翻转)、索引错乱
和 filter + slice(-1) 的区别
有人误用 arr.filter(x => x > 3).slice(-1)[0] 模拟 findLast,但这是错误的:
- filter 先全量扫描生成新数组,再取最后一个——效率低、内存多
- 无法获取原始索引(
findLastIndex的优势) - 语义不清晰,易引发误解
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











