We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
本文为读 lodash 源码的第二百七十九篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
import Stack from './Stack.js' import assignMergeValue from './assignMergeValue.js' import baseFor from './baseFor.js' import baseMergeDeep from './baseMergeDeep.js' import isObject from '../isObject.js' import keysIn from '../keysIn.js'
lodash源码分析之Stack
lodash源码分析之assignMergeValue
lodash源码分析之baseFor
lodash源码分析之baseMergeDeep
lodash源码分析之isObject
lodash源码分析之keysIn
baseMerge 的作用是将 srouce 上的所有属性都合并到 object 上。
baseMerge
srouce
object
源码如下:
function baseMerge(object, source, srcIndex, customizer, stack) { if (object === source) { return } baseFor(source, (srcValue, key) => { if (isObject(srcValue)) { stack || (stack = new Stack) baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack) } else { let newValue = customizer ? customizer(object[key], srcValue, `${key}`, object, source, stack) : undefined if (newValue === undefined) { newValue = srcValue } assignMergeValue(object, key, newValue) } }, keysIn) }
如果 object === source 表示两者相等,则不需要再合并,直接返回即可。
object === source
接着调用 baseFor 来遍历 source 上所有的属性,得到每个属性上的值 srcValue 和属性 key 。
baseFor
source
srcValue
key
接着判断 srcValue 是否为对象,如果是,则调用 baseMergeDeep 来合并每个属性上的值,注意这里的 mergeFunc 传入的是 baseMerge ,这也是产生递归深度复制的原因。
baseMergeDeep
mergeFunc
如果是其它值类型,则先判断有没有传入自定义合并函数 customizer ,如果有,则调用 customizer 得到合并后的值 newValue 。
customizer
newValue
如果 newValue 为 undefined,则表示没有传 customizer 函数或者 customizer 函数返回的值为 undefined,这种情况下,合并后的值直接就为 srcValue 。
undefined
最后调用 assignMergeValue 将 newValue 合并到 object 对应的 key 上即可。
assignMergeValue
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
The text was updated successfully, but these errors were encountered:
No branches or pull requests
本文为读 lodash 源码的第二百七十九篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
依赖
lodash源码分析之Stack
lodash源码分析之assignMergeValue
lodash源码分析之baseFor
lodash源码分析之baseMergeDeep
lodash源码分析之isObject
lodash源码分析之keysIn
源码分析
baseMerge
的作用是将srouce
上的所有属性都合并到object
上。源码如下:
如果
object === source
表示两者相等,则不需要再合并,直接返回即可。接着调用
baseFor
来遍历source
上所有的属性,得到每个属性上的值srcValue
和属性key
。接着判断
srcValue
是否为对象,如果是,则调用baseMergeDeep
来合并每个属性上的值,注意这里的mergeFunc
传入的是baseMerge
,这也是产生递归深度复制的原因。如果是其它值类型,则先判断有没有传入自定义合并函数
customizer
,如果有,则调用customizer
得到合并后的值newValue
。如果
newValue
为undefined
,则表示没有传customizer
函数或者customizer
函数返回的值为undefined
,这种情况下,合并后的值直接就为srcValue
。最后调用
assignMergeValue
将newValue
合并到object
对应的key
上即可。License
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
The text was updated successfully, but these errors were encountered: