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 的方法感觉比较不妥。 
                 |