According to the lodash docs,_.extend(object, [sources])
会改变第一个参数。
var dest = {
a: 1
};
_.extend(dest, {
b: 2
});
// expect { "a": 1, "b": 2 }
// actual { "a": 1, "b": 2 }
console.log(dest);

<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.js"></script>
&#13;
使用lodash / fp时,情况并非如此(argument order is unchanged):
var dest = {
a: 1
};
_.extend(dest, {
b: 2
});
// expect { "a": 1, "b": 2 }
// actual { "a": 1 }
console.log(dest);
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.js"></script>
<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.fp.js"></script>
&#13;
这是有问题的,因为我有很多代码会改变this
。这是lodash中的一个错误,是否有解决方法?
答案 0 :(得分:2)
这不是一个错误:不变性是一种功能性编程特征,它在指南的最开头说明:
lodash / fp模块促进更多功能编程(FP) 通过使用其方法导出lodash实例的友好风格 包装以生成不可变的自动curried iteratee-first data-last 方法
我认为你应该重新考虑使用lodash / fp或突变,它们不能很好地协同作用。
编辑:以及我错了,他们可以一起玩:见Musical Store's answer
答案 1 :(得分:2)
解决方案是配置lodash / fp以允许突变。
var fp = _.convert({
'immutable': false
})
var dest = {
a: 1
};
fp.extend(dest, {
b: 2
});
// expect { "a": 1, "b": 2 }
// actual { "a": 1, "b": 2 }
console.log(dest);
<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.js"></script>
<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.fp.js"></script>
我使用KnockoutJS将viewModels定义为函数,这需要改变this
。如果我不想用lodash / fp禁用不变性,我可以将我的viewModels定义为对象文字。 More here.