# lastIndexOf
# Description
这个方法类似 indexOf ,区别是它是从右到左遍历 array 的元素。
# Params
(array, value, fromIndex)
# Return
Number
# Depend
import baseFindIndex from './.internal/baseFindIndex.js'
import baseIsNaN from './.internal/baseIsNaN.js'
import strictLastIndexOf from './.internal/strictLastIndexOf.js'
import toInteger from './toInteger.js'
baseFindIndex 源码分析
baseIsNaN 源码分析
strictLastIndexOf 源码分析
toInteger 源码分析
# Code
function lastIndexOf(array, value, fromIndex) {
const length = array == null ? 0 : array.length
if (!length) {
return -1
}
let index = length
if (fromIndex !== undefined) {
index = toInteger(fromIndex)
index = index < 0 ? Math.max(length + index, 0) : Math.min(index, length - 1)
}
return value === value
? strictLastIndexOf(array, value, index)
: baseFindIndex(array, baseIsNaN, index, true)
}
# Analyze
首先处理 数组为 null 或者 undefined 或者空数组,这个情况下 返回 -1
处理
fromIndex,如果fromIndex是 负数,则表示从右往左数几位,所以length + fromIndex如果小于 0,就超出数组边界了,所以需要在length + fromIndex和0中取最大值,同理 如果fromIndex是 0 或者 正数,则不能超过数组最后一个元素的索引,所以取fromIndex和length - 1中最小值对于
fromIndex使用toInteger处理成了正数最后会进行判断,如果 value 不是 NaN 则使用
strictLastIndexOf进行查找,否则使用baseFindIndex, 传递baseIsNaN作为了比较函数
# Example
console.log(lastIndexOf([6,2,3,4,5,6], 6)) // 5