lodash / fp _.extend并没有像在lodash中那样改变第一个参数

时间:2016-08-21 20:11:28

标签: javascript lodash

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;
&#13;
&#13;

使用lodash / fp时,情况并非如此argument order is unchanged

&#13;
&#13;
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;
&#13;
&#13;

这是有问题的,因为我有很多代码会改变this。这是lodash中的一个错误,是否有解决方法?

2 个答案:

答案 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.