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
有没有更干净的写法来避免这种短络判断?
1
stormslowly 2017-06-28 11:57:42 +08:00
组装到一个数字里面 然后用 Array#every ?
|
2
stormslowly 2017-06-28 11:58:15 +08:00
@stormslowly 更正 是 组装到数组里面
|
3
haozhang 2017-06-28 12:02:48 +08:00 via iPhone
const a = [f.x(), f.y(), f.z()];
const b = a.reduce((pre, lat) => pre & lat,true); |
4
bombless 2017-06-28 12:38:40 +08:00 via Android
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 ()))吧 |
5
xiaojunjor 2017-06-30 14:26:42 +08:00
不是很懂需要不短路来做什么,如果单纯的想不短路最后还返回 boolean 的话,判断一下 if(f.x() & f.y() & f.z())==1 return true
else return false 就可以吧 |
6
e8c47a0d OP @xiaojunjor 比如说我想验证表单,if (!!(username.valid() & password.valid())) { },需要将表单的每个项目都判断一遍,这样 input 是否有效可以在 UI 上显示出来,可以减少用户尝试发送的次数。但这中先用 bitwise 算出 integer,再转成 boolean 的方法感觉比较不妥。
|