美文网首页
lodash源码——运算符

lodash源码——运算符

作者: 前端路上的小兵 | 来源:发表于2019-02-20 23:39 被阅读0次
    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源码——运算符

          本文链接:https://www.haomeiwen.com/subject/usyueqtx.html