【发布时间】:2017-03-14 12:25:58
【问题描述】:
假设我有一个问题对象列表。我必须找到它们是否可见,如果它们可见,我也必须将它们的答案更改为可见。 (这个例子可能不实用,它只是一个例子) 如果这是没有副作用的方式(是吗?):
questions.filter(function(question) {
return question.isVisible;
})
.map(function(visibleQuestion) {
return getAnswer(visibleQuestion);
})
.map(function(answer) {
answer.isVisible = true;
});
这是副作用的方式:
questions.forEach(function(question) {
if (question.isVisible) {
var answer = getAnswer(visibleQuestion);
answer.isVisible = true;
}
});
如果您必须迭代 3 次才能完成工作,为什么要选择无副作用的方式?
附言。我可能错了什么是副作用,什么不是,以及处理这个问题的两种方法到底是什么。
【问题讨论】:
-
我认为如果您使用纯无副作用的代码,您将不会返回原始的
answer;您将返回原始答案的副本,但将isVisible设置为true。在这种情况下,为了避免副作用而费尽心机是没有意义的。 -
如果 JS 的
map和filter是惰性的,你实际上只迭代一次。 -
正如 Zev 所提到的,您在第二个
map中无论如何都在执行副作用,因此您在强制执行功能样式但坚持命令式实践。两者混合得不好。