V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
e8c47a0d

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

  •  
  •   e8c47a0d · Jun 28, 2017 · 2366 views
    This topic created in 3225 days ago, the information mentioned may be changed or developed.
    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 replies    2017-06-30 14:30:37 +08:00
    stormslowly
        1
    stormslowly  
       Jun 28, 2017
    组装到一个数字里面 然后用 Array#every ?
    stormslowly
        2
    stormslowly  
       Jun 28, 2017
    @stormslowly 更正 是 组装到数组里面
    haozhang
        3
    haozhang  
       Jun 28, 2017 via iPhone
    const a = [f.x(), f.y(), f.z()];
    const b = a.reduce((pre, lat) => pre & lat,true);
    bombless
        4
    bombless  
       Jun 28, 2017 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  
       Jun 30, 2017
    不是很懂需要不短路来做什么,如果单纯的想不短路最后还返回 boolean 的话,判断一下 if(f.x() & f.y() & f.z())==1 return true
    else return false
    就可以吧
    e8c47a0d
        6
    e8c47a0d  
    OP
       Jun 30, 2017
    @xiaojunjor 比如说我想验证表单,if (!!(username.valid() & password.valid())) { },需要将表单的每个项目都判断一遍,这样 input 是否有效可以在 UI 上显示出来,可以减少用户尝试发送的次数。但这中先用 bitwise 算出 integer,再转成 boolean 的方法感觉比较不妥。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   943 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 21:36 · PVG 05:36 · LAX 14:36 · JFK 17:36
    ♥ Do have faith in what you're doing.