本篇继续分析下 for
家族的方法,for
方法的主要目的是实现对数组、类数组对象和普通对象的迭代。包括forEach
、forEachRight
、forOwn
、forOwnRight
及依赖的基础方法。
对应源码分析已推到 github
仓库: https://github.com/MageeLin/lodash-source-code-analysis
依赖路径图
for
家族方法的依赖路径图如下所示:
从路径图可以发现,forOwn
和 forOwnRight
方法没有依赖其他方法。而 forEach
却依赖了几个内部方法 arrayEach
、baseEach
、baseForOwn
和 baseFor
。同理 forEachRight
也是相似的方式。
forOwn
按照命名来看,其实是有 baseForOwn
这个基础方法的,但是 forOwn
并没有引用它,而是只用一个文件来实现。怀疑是之前用过但后来优化成了 Object.keys
。
forOwn
和 forOwnRight
都是分成 2
步实现:
Object.keys(object)
取到所有的对象自有可迭代属性键。- 按照正正序或者反序迭代,同时调用
iteratee
。
注意:
iteratee
中返回false
并不能打断迭代。
forOwn
/**
* 使用 iteratee 遍历一个 object 自身的可枚举属性键。
* `iteratee` 会传入3个参数:(value, key, object)。
* 如果返回 `false`,iteratee 会提前退出遍历。
*
* @since 0.3.0
* @category Object
* @param {Object} object 要迭代遍历的object
* @param {Function} iteratee 每次迭代调用 iteratee 函数
* @see forEach, forEachRight, forIn, forInRight, forOwnRight
* @example
*
* function Foo() {
* this.a = 1
* this.b = 2
* }
*
* Foo.prototype.c = 3