underscore.js依赖库函数分析二(查找)

 查找:

       在underscore.js封装了对dom查找的操作,find()和filter()函数,find()函数的查找操作是返回首个与条件相符的元素值,filter()函数是找到与条件相符的所有元素,则返回的就是一个数组,如果没有找到符合条件,则返回一个空的数组。接下来一个个分析:

 

find()函数:

     该函数根据iterator迭代器中的自定义函数条件,在集合列表中查找符合条件的第一个元素,如果找到,则返回第一个元素,否则返回“undefined”。

     实例:

   

/**
 * Created by 蒯灵敏 on 14-10-5.
 */
$(function(){
    var  list = [1,2,3,4,5];
    var first = _.find(list,function(n){
            return (!( n % 2 == 0));
    });
    console.log(first);
});

运行结果测返回第一个符合条件的元素 1,单纯看例子很简单,如果分析源码就会发现设计者的思路是怎么实现这个的,

源码:

    // Return the first value which passes a truth test. Aliased as `detect`.
    _.find = _.detect = function(obj, iterator, context) {
        // result存放第一个能够通过验证的元素
        var result;
        // 通过any方法遍历数据, 并记录通过验证的元素
        any(obj, function(value, index, list) {
            // 如果处理器返回的结果被转换为Boolean类型后值为true, 则记录当前值并返回当前元素
            if (iterator.call(context, value, index, list)) {
                result = value;
                return true;
            }
        });
        return result;
    };

在上面的例子中我们给find()函数传入的是一个集合,到源码这里参数为obj,程序拿到这个集合直接递给了一个any的函数进行真正的逻辑处理,看下这个any到底是怎么处理查找操作的:

源码:

    // Determine if at least one element in the object matches a truth test.
    // Delegates to **ECMAScript 5**‘s native `some` if available.
    // Aliased as `any`.
    var any = _.some = _.any = function(obj, iterator, context) {
        // 如果没有指定处理器参数, 则使用默认的处理器函数,该函数会返回参数本身
        iterator || (iterator = _.identity);
        var result = false;
        //如果obj参数为空则返回一个false值参数
        if (obj == null) return result;
        // 优先调用宿主环境提供的some方法
        if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
        // 迭代集合中的元素
        each(obj, function(value, index, list) {
            if (result || (result = iterator.call(context, value, index, list))) return breaker;
        });

        //这里返回一个boolean值参数
        return !!result;
    };

注:这里返回值得写法是双感叹号“!!”,说明下,javascript是弱类语音,变量没有固定的类型,于是通过这种在表达式或变量前面添加符号的方式来声明类型,这里的双感叹号将后面表达式或变量转换成boolean类型,如同三元表达式,

看下面的代码就能一目了然:

var val = !!document.getElementById

换种思路呈现:

var val  = document.getElementById ? true : false; 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。