前情提要:indexOf进入方法体的判断有点理解不能(value === value
自身和自身判断基本都是true
,如果有知道是FALSE的大佬希望能在评论区指点一下!),基本上都是进入strictIndexOf
方法。
function fromPairs(pairs)
反向版 _.toPairs,这个方法返回一个由键值对构成的对象。
@param {Array} pairs The key-value pairs.
键值对 数组
function fromPairs(pairs) {
// 数组循环起始下标
var index = -1,
// 获取数组长度
length = pairs == null ? 0 : pairs.length,
// 保存结果的对象
result = {};
// 遍历数组
while (++index < length) {
// 取出当前项
var pair = pairs[index];
// 给对象新增属性和配置属性值
result[pair[0]] = pair[1];
}
// 总结:原理十分简单,键值对都是属性+属性值的形式,所以直接遍历数组,然后将该项的0项作为属性,1项作为属性值
return result;
}
function head(array)
获得数组的首个元素
@param {Array} array The array to query.
要检索的数组
function head(array) {
// 判断数组是否存在(转Boolean为true)并且数组长度存在(因为空数组转boolean也是true)
// 如果条件满足,则返回数组的第一项,否则返回undefined
return (array && array.length) ? array[0] : undefined;
}
function indexOf(array, value, fromIndex)
根据 value 使用 SameValueZero 等值比较返回数组中首次匹配的 index, 如果 fromIndex 为负值,将从数组尾端索引进行匹配,如果将 fromIndex 设置为 true,将使用更快的二进制检索机制。
@param {Array} array The array to inspect.
要检索的数组
@param {*} value The value to search for.
要检索的值
@param {number} [fromIndex=0] The index to search from.
需要检索的起始位置。
function indexOf(array, value, fromIndex) {
// 获取数组长度
var length = array == null ? 0 : array.length;
// 判断长度是否为0
if (!length) {
// 若为0说明非数组或空数组,返回-1
return -1;
}
// 数组检索下标,如果没有传递该参数,则默认从第一位开始,若传递参数,则使用toInteger转化为数字
var index = fromIndex == null ? 0 : toInteger(fromIndex);
if (index < 0) {
// 判断转化后起始下标是否小于零?(输入负数表示从数组倒数第几位开始查询,并且需要转换成合法的数组下标)
// 如果该下标加上数组长度后和0比较,取最大值
index = nativeMax(length + index, 0);
}
// 将该参数传至基础版indexOf
return baseIndexOf(array, value, index);
}
接上面
function baseIndexOf(array, value, fromIndex) {
console.log('-------------')
console.log('value判断结果:')
console.log(value === value)
console.log('-------------')
// 这一步有点不是很清楚,经过测试,value和value的全等于比较,基本都是true
// 所以很多时候操作直接进入到了strictIndexOf中
// 什么时候进入baseFindIndex就不是很清楚了
// 他是 value 和 value 自身进行判断,所以这个条件恒等于true?我不确定
return value === value
? strictIndexOf(array, value, fromIndex)
// baseIsNaN
// 如果“value”为“NaN”则返回“true”,否则返回“false”。
: baseFindIndex(array, baseIsNaN, fromIndex);
}
function strictIndexOf(array, value, fromIndex)
参数配置同indexOf
'indexOf'的一个特殊版本,它对值执行严格的相等比较,即 ===
function strictIndexOf(array, value, fromIndex) {
// 循环起始下标
var index = fromIndex - 1,
// 数组长度
length = array.length;
// 遍历
while (++index < length) {
// 如果数组当前项全等于搜索项时,另外,在上一步操作中,如果传递的是一个对象,很有可能为fasle,引用数据类型的全等于判断和等于不同,这一点需要注意
if (array[index] === value) {
// 结束循环,返回当前遍历到的数组下标
return index;
}
}
// 如果遍历结束后仍未找到该值,则返回 -1
return -1;
}
function baseFindIndex(array, predicate, fromIndex, fromRight)
_.findIndex
和_.findLastIndex
的不支持迭代的简写版。
function baseFindIndex(array, predicate, fromIndex, fromRight) {
// 在baseIndexOf的调用中,已知传入了数组<array>、baseIsNaN<function>、起始下标<index: number>
// 这个方法是用作寻找引用数据类型的下标
// 获取数组长度
var length = array.length,
// new一个循环所用的初始值
// 运算解读:formIndex是起始位置,也就是在indexOf调用时的第三个参数
// 此时用起始位置index 去 加上 formRight(指定从右到左的迭代),如果formRight有参数,那么+1,否则-1
// 为什么要+1 或 -1 呢?这应该是lodash开发者自己编程习惯,比如说从0开始循环,他们要给index赋值-1,然后++index<length这样循环
index = fromIndex + (fromRight ? 1 : -1);
// 判断fromRigh是否存在,若存在,从数组尾部往前循环,若不存在,从数组头部开始循环
while ((fromRight ? index-- : ++index < length)) {
// baseIsNaN只接收一个参数,而传递的三个参数中,只有 array[index] 能够被识别并使用
// baseIsNaN判断该值如果是 NaN,则返回 true,否则返回FALSE,但他是 value !== value 所以不太清楚这到底判断出什么了
if (predicate(array[index], index, array)) {
return index;
}
}
return -1;
}
网友评论