解析$.grep()源码及透过$.grep()看(两次去反)!!的作用

先上jquery源码:

 1 grep: function( elems, callback, inv ) {
 2     var retVal,
 3         ret = [],
 4         i = 0,
 5         length = elems.length;
 6     inv = !!inv;
 7
 8     // Go through the array, only saving the items
 9     // that pass the validator function
10     for ( ; i < length; i++ ) {
11         retVal = !!callback( elems[ i ], i );
12         if ( inv !== retVal ) {
13             ret.push( elems[ i ] );
14         }
15     }
16
17     return ret;
18 },

这里的grep(过滤方法)不仅可以过滤数组,还可以过滤jquery中的this(jquery对象)和类数组(arguments);

它可以接受三个参数,第一个参数为需要操作的数组,第二个参数为数组每一项需要进行的回调函数;第三个参数可有可无的布尔值(当第三个参数没有时及undefined或者为null的时候通过!!inv转化为false);

对于callback执行的结果来说可能是布尔值,也可能是null或者undefined;所以又用到了两次取反保证最后得到的是一个布尔值;

callback有两个参数:第一个参数为数组的一个元素,第二个参数为index下标

当第三个参数为false/null或者说没有第三个参数(undefined)的时候;通过if ( inv !== retVal )得到的数组是retVal为true及callback返回为true的,也及是得到的是筛选出来的;如果第三个参数true,通过if ( inv !== retVal )得到的数组是retVal为false及callback返回为false的,也及是得到的是筛选之剩下的(过滤掉的);

1 var arr=$.grep([0,1,2,3,4,5,6],function(n,i){
2 return n>2
3 });
4 上面的例子返回[3,4,5,6],但是我们给inv的值为true,例如
5 var arr=$.grep([0,1,2,3,4,5,6],function(n,i){
6 return n>2
7 },ture);
8 所以现在返回的是[0,1,2],也就是被callback函数过滤掉的元素。

对于两次取反

由于对null与undefined用!操作符时都会产生true的结果,所以用两个感叹号的作用就在于,如果给出了第三个参数且非null/undefined/0""/等值,则inv为true,否则为false。

这样做的目的就是保证inv和retVal的值都只能在true/false中取,而非其它值null/undefined等,为后续判断提供便利。

1 var o={flag:true};
2 var test=!!o.flag;//等效于var test=o.flag||false;当o没有flag属性的时候也可以得到布尔值test
3 alert(test)
时间: 2024-10-12 22:42:44

解析$.grep()源码及透过$.grep()看(两次去反)!!的作用的相关文章

h2database源码浅析:事务、两阶段提交

http://blog.csdn.net/bluejoe2000/article/details/42437633 h2database源码浅析:事务.两阶段提交 2015-01-05 22:54 734人阅读 评论(0) 收藏 举报  分类: 源码故事(18)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Transaction Isolation Transaction isolation is provided for all data manipulation

视频直播源码:抖音看不到评论了?

浩浩荡荡的抖音大军在集体猜测,抖音为何不能发表评论了?视频直播抖音关闭评论引发热议,抖音评论区暂时无法显示.即使显示有上千条评论,下方仍然显示"暂无评论".不知道是抖音APP出现的bug事故,还是因为某些原因导致官方"控评".在评论区发布评论会提示"评论服务维护中".不过猜测一下,抖音评论关闭有以下几方面的原因:4月10日,广电总局责令今日头条永久关停"内涵段子"等低俗视听产品的消息传出后,大量内涵段子用户涌入抖音,以统一头像

神兽大厅源码搭建前端入行两年--教会了我这些道理

1.前言光阴似箭,日月如梭.不得不感慨时间过得很快,2017差不多结束了,一下子我从事前端开发的时间已经两年了.神兽大厅源码搭建(h5.hxforum.com)扣扣2952777280这两年可以说是一波三折,回想这两年的经历,让我忍不住了写下了这篇文章,记录自己在这两年经历的种种种种.这篇文章,打算当做自己的一个经历记录,而对于看这篇文章的你,希望你们能从我的经历里面吸取教训,希望即将步入前端和已经从事前端的你,不要想我这样一波三折,在前端的路走得更好. 2.大学时光 考完了第二次高考,紧跟着就

直播源码的开发方式有哪两种?

直播已经成为了一种行业,吸引力各路创业者,特别是一对一直播的出现,一对一直播源码也可以选择原生开发和混合开发,两种开发方式都能达到开发一对一直播的目的,这时候就会有人问:这两种开发方式有什么区别?开发一对一直播时应该选择哪种方式开发? 接下来小编就给大家汇总一下一对一直播源码原生开发和混合开发的区别,以及优缺点进行对比. 什么是原生开发? 原生应用开发是指在Android.IOS等移动平台上利用官方提供的开发语言.开发类库.开发工具进行App开发.我们常用的微软Word就是原生开发的应用程序,原

剑指offer系列源码-和为S的两个数字

题目1352:和为S的两个数字 时间限制:2 秒内存限制:32 兆特殊判题:否提交:2651解决:668 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和.其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出两个数,小的先输出.如果找不到

underscore.js源码解析

一直想针对一个框架的源码好好的学习一下编程思想和技巧,提高一下自己的水平,但是看过一些框架的源码,都感觉看的莫名其妙,看不太懂,最后找到这个underscore.js由于这个比较简短,一千多行,而且读起来容易一些,所以就决定是它了,那废话不多说开始我们的源码学习. underscore.js源码GitHub地址: https://github.com/jashkenas/underscore/blob/master/underscore.js 本文解析的underscore.js版本是1.8.3

.NET开发必看资料53个+经典源码77个

目录0豆下载:http://down.51cto.com/data/426019 附件预览: 基于.net构架的留言板项目大全源码 http://down.51cto.com/zt/70 ASP.net和C#.net通用权限系统组件功能教程 http://down.51cto.com/zt/129 跟我一起学Visual Studio 2008系列视频教程 http://down.51cto.com/zt/181 微软官方Silverlight探秘系列视频课程 http://down.51cto

Android应用Context详解及源码解析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马上要诞生这篇文章.我们平时在开发App应用程序时一直都在使用Context(别说你没用过,访问当前应用的资源.启动一个activity等都用到了Context),但是很少有人关注过这玩意到底是啥,也很少有人知道getApplication与getApplica

分享一个仿就看天气应用源码

作者xcc3641,源码SeeWeather,就看天气——是一款遵循Material Design风格的只看天气的APP.无流氓权限,无自启,xxx,用最少的权限做最优的体验. 卡片展现(当前天气情况,未来几小时天气情况,生活建议,一周七天概况)补全城市(第一版本因为自己偷懒所以城市有缺陷对不起各位)自动定位缓存数据,减少网络请求,保证离线查看内置两套图标(设置里更改)彩蛋(自动夜间状态) 源码下载:http://code.662p.com/view/12864.html 就看天气 截图<ign