# baseFor
# Description
baseForOwn 的基本实现,它迭代由 keysFunc 返回的 object 属性,并为每个属性调用 iteratee 。
Iteratee 如果返回 false 则会结束迭代
# Params
(object, iteratee, keysFunc)
Object
iteratee - 每次迭代调用的函数
keysFunc - 获取“object”键的函数
# Return
Object
# Code
function baseFor(object, iteratee, keysFunc) {
const iterable = Object(object)
const props = keysFunc(object)
let { length } = props
let index = -1
while (length--) {
const key = props[++index]
if (iteratee(iterable[key], key, iterable) === false) {
break
}
}
return object
}
# Analyze
- 首先通过
Object 构造函数
包装object
为一个新对象,避免基础类型报错 - 通过传入的
keysFunc
拿到object
所有的key
值数组,并且拿到 数组的长度 while
循环遍历,结束条件length--
- 从
props
拿到对应的下标,和while
的条件相反,while
是递减,这里取key
是递增 - 判断
iteratee
函数的执行结果是否为false
,如果为false
,则结束迭代 iteratee
函数参数分别为 当前key所对应的value
,当前key
, 包装之后的对象
# Remark
baseFor 是用来实现对象属性和值遍历的基础方法。在遍历时,会调用 iteratee 函数,如果 iteratee 函数返回 false ,则会退出遍历。
baseFor 中 iterable 和 原对象object指向同一内存空间,所以会同步的修改对应的值
# Example
const a = []
baseFor({a:1, b:2,c:3}, (value, key) => a.push([value, key]), Object.keys)
console.log(a) // [ [ 1, 'a' ], [ 2, 'b' ], [ 3, 'c' ] ]