Lodash合并操作修改源对象?引发无限递归问题解析
问题原因及解决方法
核心原因
Lodash的_.merge方法会直接修改第一个传入的对象,而非返回全新对象。你的代码里:
const obj2 = _.merge(obj1, { get: (id) => id ? 'hello from obj2' : obj1.get() })
执行_.merge后,obj1的get方法已经被替换成了你传入的新函数,而obj2其实是obj1的引用(二者指向同一内存地址)。
当调用obj2.get()时,进入分支执行obj1.get(),但此时obj1.get()就是当前这个新函数本身,于是触发无限递归。
解决方法
让_.merge生成新对象,不要修改原obj1,只需传入空对象作为第一个参数:
const _ = require('lodash') const obj1 = { get: () => 'hello from obj1' } const obj2 = _.merge({}, obj1, { get: (id) => id ? 'hello from obj2' : obj1.get() }) console.assert(obj2.get() === 'hello from obj1') // 正常执行 console.log(obj2.get(3)) // 输出hello from obj2
内容的提问来源于stack exchange,提问作者pathikrit
相关产品推荐
相关产品推荐

