我一直被教导,在某种if
情况下产生副作用是不好的。我的意思是;
if (conditionThenHandle()) {
// do effectively nothing
}
...而不是
if (condition()) {
handle();
}
...我知道,我的同事很高兴,因为我不这样做,我们每个星期五的17:00回家,每个人都有一个快乐的周末。
现在,ECMAScript5推出类似的方法every()
,并some()
到Array
了,我发现它们非常有用。他们是清洁比for (;;;)
的,再给你一个范围,并且使元素由变量访问。
但是,在验证输入时,我经常发现自己在条件中使用every
/ some
来验证输入,然后再次在正文中使用every
/ 将输入转换为可用模型。some
if (input.every(function (that) {
return typeof that === "number";
})) {
input.every(function (that) {
// Model.findById(that); etc
}
} else {
return;
}
...当我想做的是
if (!input.every(function (that) {
var res = typeof that === "number";
if (res) {
// Model.findById(that); etc.
}
return res;
})) {
return;
}
...会给我带来不良影响的副作用if
。
相比之下,这是带有旧代码的代码for (;;;)
;
for (var i=0;i<input.length;i++) {
var curr = input[i];
if (typeof curr === "number") {
return;
}
// Model.findById(curr); etc.
}
我的问题是:
- 这绝对是不好的做法吗?
- 上午我(MIS | AB)使用
some
和every
(应我可以用for(;;;)
这个?) - 有没有更好的方法?
some
,我想对元素做某事,如果我使用every
,我想对所有这些元素做某事... some
并且every
不要让我访问该信息,所以我不能使用它们,否则我必须添加副作用。
some
在我的if
条件来确定所述阵列中的某些元件是否表现出一定的属性,9/10我需要操作上在我的该元件if
主体; 现在,因为some
没有告诉我哪个元素展示了该属性(只是“一个完成了”),所以我可以在主体中some
再次使用(O(2n)),也可以在if条件中执行操作(这很不好,因为它在头部会产生副作用。
every
当然也是如此。