underscore源码分析——map()
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

基本用法

  • 难度评级:2/9
  • 又名_.collect()
参数解释
  • obj Array对象、String对象、Object对象
  • iterator Function对象function(value, index, list){...}
    • value (Array)元素、(String)字符、(Object)值
    • index (Array)下标、(String)位置、(Object)键
    • list 该obj
  • context 可选,用于取代iterator中的this
用例1

将对象的键放入一个数组

var bolt = _.map ({"a":10, "b": "string"}, function(a,b,c){return  b;});

结果

bolt = ["a", "b"]

源码分析

 function(obj, iterator, context) {
    var results = [];
    if (obj == null) return results;
    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
    each(obj, function(value, index, list) {
      results[results.length] = iterator.call(context, value, index, list);
    });
    return results;
  };
变量说明
var nativeMap = Array.prototype.map
调用方法 原生map()

msdn链接

  • Array对象方法

每个元素+10

var bolt = [1, 2, 3].map(function(a,b,c){return a+10;});

结果

bolt = [11, 12, 13]
原生call()

msdn链接

  • Function对象方法

源码中

results[results.length] = iterator.call(context, value, index, list);

context用于取代iterator中的this,若无此参数,可退化为

results[results.length] = iterator(value, index, list);
自定义each()

underscore源码分析

  • 它就是_.each()
逻辑分析
  • 略,程序是最精炼的语言。

自由畅想

  • 若iterator参数中,function(value, index, list){...}没有return返回值,_.map()方法完全可以拿来当_.each()方法用
  • 会继承_.each()方法的bug

此underscore.js版本为1.4.4,最新版中部分方法已改进、多数bug已修复。

评论
发表评论
暂无评论
WRITTEN BY
BoltDoggy
A doggy named Bolt.
TA的新浪微博
PUBLISHED IN
underscore.js源码分析【半途而费】

Bolt 在本专栏已停止更新。

由于本屌实力不够,没有能力维持本专栏,故个人停止更新。

但仍欢迎对underscore.js有兴趣的各大神来此专栏发表文章。


Bolt 在写underscore.js源码分析专栏的时候发现了一个问题,就是看别人写的代码的时候自认为看懂了,但实际上有理解错误自己也不知道。

另外就是看了再牛逼的代码,自己写的时候,还是那些小套套。

于是 Bolt 开了一个新专栏:My Code Wars 我的代码战争。在同一需求下,菜鸟写的代码与大神有什么区别,是思维方式不同,还是什么原因导致的?

欢迎大家来新专栏提供意见和建议。


本专栏

  • 阅读 面向 新手
  • 写作 面向 进阶
  • 指正 面向 大神

新手

  • 这里的新手并不是代表初学者,而是已经掌握了JavaScript的基本用法
  • 通过深入知名函数库underscore.js,了解一些常见原生函数的用法
  • 学会使用简单的underscore.js扩展方法
  • 知名函数库的源码,也不过如此嘛

进阶

  • 感觉JavaScript的知识要点都掌握了,面对项目却不知如何下手
  • 读点源码,大项目的看不懂?那就从underscore.js开始
  • 养成良好的写作习惯,培养优秀的表达能力,快来专栏发文吧
  • 知名函数库的源码,也不过如此嘛

大神

  • 如果您也想来专栏发文,热烈欢迎
  • 请您更多的关注我们专栏文章内的错误
  • 对某篇文章不满意,您可以对相关内容整理后重发
  • 知名函数库的源码,还是以实用为主

专栏发文要求

  • 以underscore.js为中心,扩展到backbone.js等相关函数库
  • 以指导新人、提升自己两个基本点
  • 坚持【入门式】,【基础性】,【总结性】,【普及式】四项基本原则
  • 实践是检验源码的唯一标准
  • 扩展才是硬道理,无bug压倒一切

您好,我是Bolt。Bolt本人发表的文章,将会首发于h-won之队

欢迎大神们指出错误,如回复在首发之处,感激不尽

友情链接 大搜车前端团队博客
我的收藏