fromRight ? index-- : ++index < length
源码
/**
* The base implementation of `_.findIndex` and `_.findLastIndex` without
* support for iteratee shorthands.
*
* @private
* @param {Array} array The array to inspect.
* @param {Function} predicate The function invoked per iteration.
* @param {number} fromIndex The index to search from.
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function baseFindIndex(array, predicate, fromIndex, fromRight) {
var length = array.length,
index = fromIndex + (fromRight ? 1 : -1);
while ((fromRight ? index-- : ++index < length)) {
if (predicate(array[index], index, array)) {
return index;
}
}
return -1;
}
解析
fromRight ? index-- : ++index < length
/*
现在问题来了,这个三元表达式有两种可能,一种是:
*/
(fromRight ? index-- : ++index) < length
/*
一种是:
*/
fromRight ? index-- : (++index < length)
/*
根据MDN表格优先级
这个表将优化级划分成了20个级别,数字越大,优化级越高。
从表中可以看到,比较运算符的优先级为11,而三元表达式(条件运算符)的优化级为4,
因此可以确定比较运算符的优先级要比三元表达式的要高,循环条件其实等价于第二种写法。
*/
array || (array = Array(length));
/**
* Copies the values of `source` to `array`.
*
* @private
* @param {Array} source The array to copy values from.
* @param {Array} [array=[]] The array to copy values to.
* @returns {Array} Returns `array`.
*/
function copyArray(source, array) {
var index = -1,
length = source.length;
// 当传入array的时候则跳过后面一步,如果没有传入,即!!array为false,则执行后面异步,array被赋予新的值
array || (array = Array(length));
// 如果不是传入数组会报错吗?答案是不会,并且同样有进行赋值操作,同时不会报错
while (++index < length) {
array[index] = source[index];
}
return array;
}
length = array == null ? 0 : array.length
/**
* A specialized version of `_.map` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
*/
function arrayMap(array, iteratee) {
var index = -1,
// 三目表达式和赋值运算符:先三目后赋值
// 这样可以对length的值进行正确的赋值
length = array == null ? 0 : array.length,
// 通过Array(length)来创建一个和源数组一样长度的空数组
result = Array(length);
while (++index < length) {
result[index] = iteratee(array[index], index, array);
}
return result;
}
网友评论