lodash源码——运算符

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;
}
参考网址

https://segmentfault.com/a/1190000013133803

你可能感兴趣的:(lodash源码——运算符)