手机版

下划线源代码分析

时间:2021-09-19 来源:互联网 编辑:宝哥软件园 浏览:

几年前,有人说javascript是最被低估的编程语言。自从nodejs问世以来,全栈/全栈的概念日益兴起。现在,恐怕没有人敢低估它。Javascript是一种类似C的语言。如果你有C语言的基础,一般可以理解javascript代码。但是,作为一种脚本语言,JavaScript远不如C语言灵活,这也会给学习造成一定的困难。

一、收藏。

1.首先,有几种迭代方法。

_.每个=_。forEach=function(obj,iterate,context){ iterate=optimizec b(iterate,context);var i,长度;if (isArrayLike(obj)) { for (i=0,length=obj.length一、长度;i ) {迭代(obj[i],I,obj);} } else { var keys=_。键(obj);for (i=0,length=keys.length一、长度;i ) {迭代(obj[keys[i]],keys[i],obj);} }//链调用返回obj};ES还向数组中添加了一个本机forEach()方法。不同的是这里的每个(forEach)方法可以用于所有集合,函数接受三个参数(集合、迭代函数和执行环境)。

OptimizeCb函数根据迭代函数的参数个数为不同的迭代方法绑定相应的执行环境,forEach迭代函数也接受三个参数(值、索引和集合)。

接下来,for循环调用迭代函数。

一种更优雅的方式来判断isArrayLike in _。map:(仅使用一个for循环)。

var keys=!isArrayLike(obj) _。keys(obj),length=(keys || obj)。长度,结果=数组(长度);for (var索引=0;索引长度;index){ var currentKey=key?keys[index] :索引;结果[索引]=迭代(obj[currentKey],currentKey,obj);}返回结果;//合理使用,| |,3360可以大大减少代码量,而且有两个特别之处:

集合分为类数组集合和对象集合。使用了IsArrayLike函数:

//js=math.pow (2,53)-1的最大精确整数varmax _ array _ indexvar isArrayLike=函数(集合){var length=集合!=null collection.length返回类型的长度=='number '长度=0长度=MAX _ ARRAY _ INDEX};//如果集合有Length属性且为数字,且大于0且小于最大精确整数,则判断类数组使用了_。key函数,Object也有一个原生key函数,用来返回一个属性数组,在这个数组中可以枚举set obj。实现相对简单,例如在plus hasOwnProperty()方法中。

-

_。地图和_。简化方法在原理上是相似。

_。find函数与Array.some()类似,只是它返回使迭代结果为真的第一个元素,而不是返回像Array.some()这样的布尔值。

_.find=_。detect=function(obj、谓词、上下文){ var keyif (isArrayLike(obj)) { key=_。findIndex(obj、谓词、上下文);} else { key=_。findKey(obj、谓词、上下文);} if (key!==无效0键!==-1)返回obj[key];};函数createIndexFinder(dir) {返回函数(数组、谓词、上下文){谓词=cb(谓词、上下文);var长度=数组!=null数组. length;//如果dir为1,index为0,index=1,则索引以正顺序循环。//如果dir为-1,index为length-1,index=-1以相反的顺序循环。//采用index=0索引长度的方法判断循环情况,兼顾两种循环方式。0 :长度-1;for(;索引=0索引长度;index=dir) { if(谓词(array[index],index,array))返回index;}返回-1;};} _.find index=createIndexFinder(1);_.findLastIndex=createIndexFinder(-1);值得学习的是,这里的一个for循环可以根据不同的参数配置不同的循环序列。

1.集合中的其他方法基本上基于迭代方法。

_.max=function(obj,迭代,上下文){var result=-Infinity,lastcuted=-Infinity,value,computedif(迭代==null obj!=null) { obj=isArrayLike(obj)?obj : _。值(obj);for (var i=0,length=obj.length一、长度;I){ value=obj[I];if(值结果){ result=value} } } else { iterate=CB(iterate,context);_.每个(obj,function(value,index,list)){ computed=iterate(value,index,list);if(computed lastcuted | | computed===-Infinity result===-Infinity){ result=value;lastComputed=computed} });}返回结果;};Max方法用于查找集合中的最大值,方法是循环列表中的所有项,然后将当前项与结果项进行比较,如果当前项大于结果,则将其分配给结果项,最后返回结果项。

2.集合被转换为数组。

_.toArray=function(obj) { if(!返回[];//如果是数组,则在(_)时采用array . prototype . slice . call(this,obj)的方法。Isarray (obj))返回slice . call(obj);//类数组对象,这里,集合不是使用Slice方法,而是由。映射以返回数组。_.标识此方法传入的值等于返回的值。(主要用于迭代)if (isarraylike (obj)) return _。地图(obj,_。身份);//普通对象,返回由属性值组成的数组。return _。值(obj);};数据类型

STL需要区分向量和列表,因为不同的数据结构需要或者可以不同的实现,但是用下划线分隔Collections和Arrays的原因是什么呢?这也应该从javascript的数据类型开始,见下图。

版权声明:下划线源代码分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。