JavaScript通过单独的条件设置布尔值?

时间:2012-06-05 14:04:25

标签: javascript boolean

我需要设计一个带有2个条件a和b的全局布尔值,这样如果A为真,则布尔值为真,直到b为真,此时布尔值为false。换句话说,如果A变为false,则布尔值保持为真。

我尝试了一个直截了当的全局变量,但是当A变为假时它变得错误。

最好使用JavaScript,但伪代码几乎同样有用。

5 个答案:

答案 0 :(得分:2)

这听起来像异或。即

!A and !B == false
A and !B == true
!A and B == true
A and B == false

不幸的是,JavaScript没有逻辑XOR运算符,但是

if(A?!B:B){

功能相同

答案 1 :(得分:2)

如果我正确理解您的问题,那么将这些案例与

相匹配应该相当容易
var bool = (a != b);
/*
    (false != false) = false
    (true != false) = true
    (false != true) = true
    (true != true) = false
*/

根据您的更改,您可以创建全局变量var aWasEverTrue = a;然后直接设置a,而不是使用setA(true)等函数。

var a = false;
var b = false;
var aWasEverTrue = a;
function setA(newAValue) {
    aWasEverTrue = true;
    a = newAValue;
}

// (aWasEverTrue != b) = false

setA(true);
// (aWasEverTrue != b) = true

b = true;
// (aWasEverTrue != b) = false

setA(false);
// (aWasEverTrue != b) = false (as aWasEverTrue is still true)

b = false
// (aWasEverTrue != b) = true

答案 2 :(得分:2)

Javascript老派方式:

function Enjoy() {
    this.a = true;
    this.b = true;
    this.bool = true;
}

Enjoy.prototype = {
    constructor: Enjoy,

    setA: function( val ) {
        this.a = val;
        if ( this.a === true && this.b === true ) this.bool = false;
        else if ( this.a === true && this.b === false ) this.bool = true;
    },

    setB: function( val ) {
        this.b = val;
        if ( this.a === true && this.b === true ) this.bool = true;
        else if ( this.a === true && this.b === false ) this.bool = false;
    },

    getBool: function() {
        return this.bool;
    }
};

var enjoy = new Enjoy();
enjoy.getBool(); // true
enjoy.setB( false );
enjoy.getBool(); // false

正如您所看到的,我们的想法是为您的布尔值以及ab变量使用getter / setter,您可以在其中执行所有逻辑。

顺便说一下,这个问题绝对适用于StackOverflow。

答案 3 :(得分:2)

你想要的是状态机

结果的国家:

T (True)
F (False)

过渡:

F -- a (true) --> T
F -- anything else --> F
T -- b (true) --> F
T -- anything else --> T

您可以使用一系列if s

来表达它

答案 4 :(得分:0)

基于关于如果A不成立,B应如何表现的一些假设:

function FlipFlop(){
    this.latch = false;
    this.value = false;
}

FlipFlop.prototype = {
    constructor: FlipFlop,

    setA: function( val ) {
        this.latch = this.latch || !!val;
        this.value = this.latch;
    },

    setB: function( val ) {
        if(this.latch && !!val) {
            this.latch = false;
        }
        this.value = !val;
    },

    getVal: function() {
        return this.value;
    }
}