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

JavaScript通过单独的条件设置布尔值?,javascript,boolean,Javascript,Boolean,我需要设计一个具有2个条件a和b的全局布尔值,这样,如果a为真,布尔值为真,直到b为真,此时布尔值为假。换句话说,如果A变为false,则布尔值仍为true 我尝试了一个简单的全局变量,但当a变为false时,它变为false 最好是JavaScript,但伪代码几乎同样有用。这听起来像是XOR。i、 e !A and !B == false A and !B == true !A and B == true A and B == false 然而,不幸的是,JavaScript没有逻辑XOR

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

我尝试了一个简单的全局变量,但当a变为false时,它变为false


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

这听起来像是XOR。i、 e

!A and !B == false
A and !B == true
!A and B == true
A and B == false
然而,不幸的是,JavaScript没有逻辑XOR运算符

如果是一个!B:B{


在功能上是等效的

如果我正确理解了您的问题,那么将这些情况与

var bool = (a != b);
/*
    (false != false) = false
    (true != false) = true
    (false != true) = true
    (true != true) = false
*/
通过更改,您可以创建一个全局变量var aWasEverTrue=a;然后使用setAtrue之类的函数,而不是直接设置a


传统方式:

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
正如您所看到的,我们的想法是对布尔值以及a和b变量使用getter/setter,在这两个变量中,您可以执行所有逻辑


顺便说一下,这个问题肯定是针对StackOverflow的。

您需要的是一个状态机

关于结果的国家:

T (True)
F (False)
过渡:

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

您可以使用一系列ifs来表达它,这些ifs基于一些假设,即如果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;
    }
}

这只适用于两个都是布尔值的情况…你可以这样做!a!=!b来尝试强制。同样,这些答案的问题是它们忽略了时间元素。我需要在测试b之前知道a是否为真。换句话说,现在可能为假,但如果在某个较早的点上为真,我应该测试b。如果b为真,则全局布尔为真false.感谢您的关注tho.抱歉,没有准确阅读此内容;在第三种情况下,这实际上是错误的。任何B为true的情况都必须为false.那么aWasEverTrue&!B呢?您需要在setter中添加一些逻辑,并且可能还需要一些其他变量。抱歉,我速度较慢,但我没有看到它。我创建的任何其他变量都将是错误的依赖于第一个变量,它依赖于A,因此当A为假时为假?听起来像是触发器电路的逻辑等价物。只有一个A和一个B,或者这需要重新使用吗?我相信触发器是正确的。是的,只有一个A和B这看起来可能工作,我将很快测试它。非常感谢!既然如此。a和这个.b永远不会被设置,除非在构造函数中,否则这段代码将不起作用。但是设置不是发生在'previous.setB false'中吗?getVal之后的冒号是什么?如果这是一个gimme,很抱歉,并提前感谢。另一个问题是:这个| |=运算符是什么?:-你知道| |的作用吗?与+和+=相比。冒号代表键:value syn对象文字税。它在被分配的对象上定义了一个名为“getVal”的成员。尾随冒号不是必需的,但如果包含它,则不会中断任何内容。许多开发人员都包含它,因此以后向对象添加方法或属性会更容易,并且他们不必考虑在之前的最后一个对象上添加冒号line.and | |=不是有效的运算符,像这样同时使用OR和EQUALS会抛出:未捕获的语法错误:意外标记=!!a^B应该可以工作,因为false被转换为0,true被转换为1,然后结果被转换回布尔值。事实上:!!true^ true false!!true^ false true!!false^ true false!!false^ false
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;
    }
}