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

感谢米粽粽、飞天小黑神猪指出本文错误,个人能力有限,考虑不周,欢迎大家提出建设意见。

原生的JavaScript中Array对象有一个forEach()方法,underscore的each()方法,是将其改进,还是多此一举呢?

```js

  function(obj, iterator, context) {
    if (obj == null) return;
    if (nativeForEach && obj.forEach === nativeForEach) {
      obj.forEach(iterator, context);
    } else if (obj.length === +obj.length) {
      for (var i = 0, l = obj.length; i < l; i++) {
        if (iterator.call(context, obj[i], i, obj) === breaker) return;
      }
    } else {
      for (var key in obj) {
        if (_.has(obj, key)) {
          if (iterator.call(context, obj[key], key, obj) === breaker) return;
        }
      }
    }
  };

```

在函数定义中,调用了underscore的has()方法,用于判断该对象是否拥有此方法,可以参阅超链接:《underscore源码分析——has()》

call()方法是所有Function对象(包括函数、对象的方法)都拥有的方法,详见超链接:w3school

js obj.length === +obj.length

用来判断判断该对象是否拥有length属性,拥有length属性的有Array对象、String对象

还有breaker、nativeForEach变量,

js var bresker = {}; var nativeForEach = Array.prototype.forEach;

当该对象拥有nativeForEach时,优先使用原生的forEach()方法;否则,underscore分别为Array/String对象、Object对象重写了该方法.

从源码中可以看出,虽然官方文档中没有明确说明,我们可以在iterator参数,也就是传入的回调函数的使用

js return {};

来中断forEach().

之前这里考虑不周,{} === {} 返回的是 false ,因为这是不同的对象。

each()作为undersore的方法,只能将Array对象作为参数传入,同时又打开了大门,也可以传入Object对象、String对象,使得each()封装了可以遍历对象属性的功能。

你好,我是Bolt。本文为Bolt原创,首发于h-won之队

可以随意引用,无需注明出处。

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

评论
发表评论
暂无评论
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之队

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

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