V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
e8c47a0d
V2EX  ›  JavaScript

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

  •  
  •   e8c47a0d · 2017-06-28 11:43:40 +08:00 · 1923 次点击
    这是一个创建于 2705 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    

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

    6 条回复    2017-06-30 14:30:37 +08:00
    stormslowly
        1
    stormslowly  
       2017-06-28 11:57:42 +08:00
    组装到一个数字里面 然后用 Array#every ?
    stormslowly
        2
    stormslowly  
       2017-06-28 11:58:15 +08:00
    @stormslowly 更正 是 组装到数组里面
    haozhang
        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);
    bombless
        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 ()))吧
    xiaojunjor
        5
    xiaojunjor  
       2017-06-30 14:26:42 +08:00
    不是很懂需要不短路来做什么,如果单纯的想不短路最后还返回 boolean 的话,判断一下 if(f.x() & f.y() & f.z())==1 return true
    else return false
    就可以吧
    e8c47a0d
        6
    e8c47a0d  
    OP
       2017-06-30 14:30:37 +08:00
    @xiaojunjor 比如说我想验证表单,if (!!(username.valid() & password.valid())) { },需要将表单的每个项目都判断一遍,这样 input 是否有效可以在 UI 上显示出来,可以减少用户尝试发送的次数。但这中先用 bitwise 算出 integer,再转成 boolean 的方法感觉比较不妥。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2638 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:46 · PVG 10:46 · LAX 18:46 · JFK 21:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.