Convert boolean result into number/integer

前端 未结 18 2073
刺人心
刺人心 2020-12-02 05:21

I have a variable that stores false or true, but I need 0 or 1 instead, respectively. How can I do this?

相关标签:
18条回答
  • 2020-12-02 06:04

    You could do this by simply extending the boolean prototype

    Boolean.prototype.intval = function(){return ~~this}
    

    It is not too easy to understand what is going on there so an alternate version would be

    Boolean.prototype.intval = function(){return (this == true)?1:0}
    

    having done which you can do stuff like

    document.write(true.intval());
    

    When I use booleans to store conditions I often convert them to bitfields in which case I end up using an extended version of the prototype function

    Boolean.prototype.intval = function(places)
    {
     places = ('undefined' == typeof(places))?0:places; 
     return (~~this) << places
    }
    

    with which you can do

    document.write(true.intval(2))
    

    which produces 4 as its output.

    0 讨论(0)
  • 2020-12-02 06:05

    In my context, React Native where I am getting opacity value from boolean, the easiest way: Use unary + operator.

    + true; // 1
    + false; // 0
    

    This converts the boolean into number;

    style={ opacity: +!isFirstStep() }
    
    0 讨论(0)
  • 2020-12-02 06:06

    I have tested all of this examples, I did a benchmark, and finally I recommend you choose the shorter one, it doesn't affect in performance.

    Runned in Ubuntu server 14.04, nodejs v8.12.0 - 26/10/18

        let i = 0;
    console.time("TRUE test1")
        i=0;
        for(;i<100000000;i=i+1){
            true ? 1 : 0;
        }
    console.timeEnd("TRUE test1")
    
    
    console.time("FALSE test2")
        i=0;
        for(;i<100000000;i=i+1){
            false ? 1 : 0;
        }
    console.timeEnd("FALSE test2")
    
    console.log("----------------------------")
    
    console.time("TRUE test1.1")
        i=0;
        for(;i<100000000;i=i+1){
            true === true ? 1 : 0;
        }
    console.timeEnd("TRUE test1.1")
    
    
    console.time("FALSE test2.1")
        i=0;
        for(;i<100000000;i=i+1){
            false === true ? 1 : 0;
        }
    console.timeEnd("FALSE test2.1")
    
    console.log("----------------------------")
    
    console.time("TRUE test3")
        i=0;
        for(;i<100000000;i=i+1){
            true | 0;
        }
    console.timeEnd("TRUE test3")
    
    console.time("FALSE test4")
        i=0;
        for(;i<100000000;i=i+1){
            false | 0;
        }
    console.timeEnd("FALSE test4")
    
    console.log("----------------------------")
    
    console.time("TRUE test5")
        i=0;
        for(;i<100000000;i=i+1){
            true * 1;
        }
    console.timeEnd("TRUE test5")
    
    console.time("FALSE test6")
        i=0;
        for(;i<100000000;i=i+1){
            false * 1;
        }
    console.timeEnd("FALSE test6")
    
    console.log("----------------------------")
    
    console.time("TRUE test7")
        i=0;
        for(;i<100000000;i=i+1){
            true & 1;
        }
    console.timeEnd("TRUE test7")
    
    console.time("FALSE test8")
        i=0;
        for(;i<100000000;i=i+1){
            false & 1;
        }
    console.timeEnd("FALSE test8")
    
    console.log("----------------------------")
    
    console.time("TRUE test9")
        i=0;
        for(;i<100000000;i=i+1){
            +true;
        }
    console.timeEnd("TRUE test9")
    
    console.time("FALSE test10")
        i=0;
        for(;i<100000000;i=i+1){
            +false;
        }
    console.timeEnd("FALSE test10")
    
    console.log("----------------------------")
    
    console.time("TRUE test9.1")
        i=0;
        for(;i<100000000;i=i+1){
            0+true;
        }
    console.timeEnd("TRUE test9.1")
    
    console.time("FALSE test10.1")
        i=0;
        for(;i<100000000;i=i+1){
            0+false;
        }
    console.timeEnd("FALSE test10.1")
    
    console.log("----------------------------")
    
    console.time("TRUE test9.2")
        i=0;
        for(;i<100000000;i=i+1){
            -true*-1;
        }
    console.timeEnd("TRUE test9.2")
    
    console.time("FALSE test10.2")
        i=0;
        for(;i<100000000;i=i+1){
            -false*-1;
        }
    console.timeEnd("FALSE test10.2")
    
    console.log("----------------------------")
    
    console.time("TRUE test9.3")
        i=0;
        for(;i<100000000;i=i+1){
            true-0;
        }
    console.timeEnd("TRUE test9.3")
    
    console.time("FALSE test10.3")
        i=0;
        for(;i<100000000;i=i+1){
            false-0;
        }
    console.timeEnd("FALSE test10.3")
    
    console.log("----------------------------")
    
    console.time("TRUE test11")
        i=0;
        for(;i<100000000;i=i+1){
            Number(true);
        }
    console.timeEnd("TRUE test11")
    
    console.time("FALSE test12")
        i=0;
        for(;i<100000000;i=i+1){
            Number(false);
        }
    console.timeEnd("FALSE test12")
    
    console.log("----------------------------")
    
    console.time("TRUE test13")
        i=0;
        for(;i<100000000;i=i+1){
            true + 0;
        }
    console.timeEnd("TRUE test13")
    
    console.time("FALSE test14")
        i=0;
        for(;i<100000000;i=i+1){
            false + 0;
        }
    console.timeEnd("FALSE test14")
    
    console.log("----------------------------")
    
    console.time("TRUE test15")
        i=0;
        for(;i<100000000;i=i+1){
            true ^ 0;
        }
    console.timeEnd("TRUE test15")
    
    console.time("FALSE test16")
        i=0;
        for(;i<100000000;i=i+1){
            false ^ 0;
        }
    console.timeEnd("FALSE test16")
    
    console.log("----------------------------")
    
    console.time("TRUE test17")
        i=0;
        for(;i<100000000;i=i+1){
            true ^ 0;
        }
    console.timeEnd("TRUE test17")
    
    console.time("FALSE test18")
        i=0;
        for(;i<100000000;i=i+1){
            false ^ 0;
        }
    console.timeEnd("FALSE test18")
    
    console.log("----------------------------")
    
    console.time("TRUE test19")
        i=0;
        for(;i<100000000;i=i+1){
            true >> 0;
        }
    console.timeEnd("TRUE test19")
    
    console.time("FALSE test20")
        i=0;
        for(;i<100000000;i=i+1){
            false >> 0;
        }
    console.timeEnd("FALSE test20")
    
    console.log("----------------------------")
    
    console.time("TRUE test21")
        i=0;
        for(;i<100000000;i=i+1){
            true >>> 0;
        }
    console.timeEnd("TRUE test21")
    
    console.time("FALSE test22")
        i=0;
        for(;i<100000000;i=i+1){
            false >>> 0;
        }
    console.timeEnd("FALSE test22")
    
    console.log("----------------------------")
    
    console.time("TRUE test23")
        i=0;
        for(;i<100000000;i=i+1){
            true << 0;
        }
    console.timeEnd("TRUE test23")
    
    console.time("FALSE test24")
        i=0;
        for(;i<100000000;i=i+1){
            false << 0;
        }
    console.timeEnd("FALSE test24")
    
    console.log("----------------------------")
    
    console.time("TRUE test25")
        i=0;
        for(;i<100000000;i=i+1){
            ~~true;
        }
    console.timeEnd("TRUE test25")
    
    console.time("FALSE test26")
        i=0;
        for(;i<100000000;i=i+1){
            ~~false;
        }
    console.timeEnd("FALSE test26")
    
    console.log("----------------------------")
    
    console.time("TRUE test25.1")
        i=0;
        for(;i<100000000;i=i+1){
            ~true*-1-1;
        }
    console.timeEnd("TRUE test25.1")
    
    console.time("FALSE test26.1")
        i=0;
        for(;i<100000000;i=i+1){
            ~false*-1-1;
        }
    console.timeEnd("FALSE test26.1")
    
    console.log("----------------------------")
    
    console.time("TRUE test27")
        i=0;
        for(;i<100000000;i=i+1){
            true/1;
        }
    console.timeEnd("TRUE test27")
    
    console.time("FALSE test28")
        i=0;
        for(;i<100000000;i=i+1){
            false/1;
        }
    console.timeEnd("FALSE test28")
    

    Result

    TRUE test1: 93.301ms
    FALSE test2: 102.854ms
    ----------------------------
    TRUE test1.1: 118.979ms
    FALSE test2.1: 119.061ms
    ----------------------------
    TRUE test3: 97.265ms
    FALSE test4: 108.389ms
    ----------------------------
    TRUE test5: 85.854ms
    FALSE test6: 87.449ms
    ----------------------------
    TRUE test7: 83.126ms
    FALSE test8: 84.992ms
    ----------------------------
    TRUE test9: 99.683ms
    FALSE test10: 87.080ms
    ----------------------------
    TRUE test9.1: 85.587ms
    FALSE test10.1: 86.050ms
    ----------------------------
    TRUE test9.2: 85.883ms
    FALSE test10.2: 89.066ms
    ----------------------------
    TRUE test9.3: 86.722ms
    FALSE test10.3: 85.187ms
    ----------------------------
    TRUE test11: 86.245ms
    FALSE test12: 85.808ms
    ----------------------------
    TRUE test13: 84.192ms
    FALSE test14: 84.173ms
    ----------------------------
    TRUE test15: 81.575ms
    FALSE test16: 81.699ms
    ----------------------------
    TRUE test17: 81.979ms
    FALSE test18: 81.599ms
    ----------------------------
    TRUE test19: 81.578ms
    FALSE test20: 81.452ms
    ----------------------------
    TRUE test21: 115.886ms
    FALSE test22: 88.935ms
    ----------------------------
    TRUE test23: 82.077ms
    FALSE test24: 81.822ms
    ----------------------------
    TRUE test25: 81.904ms
    FALSE test26: 82.371ms
    ----------------------------
    TRUE test25.1: 82.319ms
    FALSE test26.1: 96.648ms
    ----------------------------
    TRUE test27: 89.943ms
    FALSE test28: 83.646ms
    
    0 讨论(0)
  • 2020-12-02 06:08

    You can also add 0, use shift operators or xor:

    val + 0;
    val ^ 0;
    val >> 0;
    val >>> 0;
    val << 0;
    

    These have similar speeds as those from the others answers.

    0 讨论(0)
  • 2020-12-02 06:09

    try

    val*1
    

    let t=true;
    let f=false;
    
    console.log(t*1);
    console.log(f*1)

    0 讨论(0)
  • 2020-12-02 06:13

    +!! allows you to apply this on a variable even when it's undefined:

    +!!undefined    // 0
    +!!false        // 0
    +!!true         // 1
    
    +!!(<boolean expression>)  // 1 if it evaluates to true, 0 otherwise
    
    0 讨论(0)
提交回复
热议问题