有什么方法可以避免 short-circuit evaluation?

2017-06-28 11:43:40 +08:00
 e8c47a0d
let f = {
  x() { return false },
  y() { return true },
  z() { return true }
};
console.log(f.x() && f.y() && f.z());
// false

这段代码只有 x() 被执行,如果需要让 x、y、z 都被执行,只能用 bitwise 操作符,但返回值不是 boolean,只能变相转换成 boolean:

console.log(
  (f.x() & f.y() & f.z()) == true
);
// false

有没有更干净的写法来避免这种短络判断?

1947 次点击
所在节点    JavaScript
6 条回复
stormslowly
2017-06-28 11:57:42 +08:00
组装到一个数字里面 然后用 Array#every ?
stormslowly
2017-06-28 11:58:15 +08:00
@stormslowly 更正 是 组装到数组里面
haozhang
2017-06-28 12:02:48 +08:00
const a = [f.x(), f.y(), f.z()];
const b = a.reduce((pre, lat) => pre & lat,true);
bombless
2017-06-28 12:38:40 +08:00
function s () { for (var i = 0; i < arguments.length; i ++)if (!arguments[i]) return false; return true; }
然后 console.log (s (f.x (), f.y (), f.z ()))吧
xiaojunjor
2017-06-30 14:26:42 +08:00
不是很懂需要不短路来做什么,如果单纯的想不短路最后还返回 boolean 的话,判断一下 if(f.x() & f.y() & f.z())==1 return true
else return false
就可以吧
e8c47a0d
2017-06-30 14:30:37 +08:00
@xiaojunjor 比如说我想验证表单,if (!!(username.valid() & password.valid())) { },需要将表单的每个项目都判断一遍,这样 input 是否有效可以在 UI 上显示出来,可以减少用户尝试发送的次数。但这中先用 bitwise 算出 integer,再转成 boolean 的方法感觉比较不妥。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/371628

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX