逻辑运算符||不知何故没有得到预期的结果

时间:2019-09-24 12:08:48

标签: javascript kendo-ui logical-operators

我有一个变量,用于启用某些功能以进行编辑或看起来不像这样

enabled: !(parseInt("@Model.Status") === @((int)Status.Active) ||
!(parseInt("@Model.Status") === @((int)Status.Expired)) && '@Model.EditMode' === 'True'),

出于某种原因,如果这适用于状态为active而不是expired的用户,并且如果我将其转过来并放在expired的开头,则它适用于expired,但不能使用active个...。所以我在这里错了,有人认为,如果状态为ExpiredActive,则启用应为false,以便不能将其替换为所有其他状态应该没事。

我也试图用第二个语句的括号将其写成这样

!((parseInt("@Model.Status") === @((int)Status.Expired))

像这样颠倒if,但没有一个解决

 (parseInt("@Model.Status") !== @((int)Status.Expired)

Pointy的好评!但是不幸的是,这也不是问题,因为即使我跳过了整个&&运算符,我仍然遇到同样的问题

 !(parseInt("@Model.Status") === @((int)Status.Active) || !(parseInt("@Model.Status") === @((int)Status.Expired)))

这仍然会带来相同的问题

1 个答案:

答案 0 :(得分:2)

您的情况似乎不对。 !(parseInt("@Model.Status") === @((int)Status.Active) || !(parseInt("@Model.Status") === @((int)Status.Expired)) && '@Model.EditMode' === 'True')

可以看成!(a || !(b) && c),其中

a = parseInt("@Model.Status") === @((int)Status.Active)
b = parseInt("@Model.Status") === @((int)Status.Expired)
c = '@Model.EditMode' === 'True'

AND运算符(&&)的优先级高于||,因此可以使用分组为!(a || (!(b) && c))来显示实际评估顺序,就像评估2 + 3 * 4的方式一样为2 + (3 * 4)

但是,提出的逻辑与要求不符。除了活动或已过期的编辑模式外,该状态均应为“ True”。但是,由于方括号( entire )逻辑表达式被否定,并且第二个条件也被否定了,因此括号可能由于拼写错误而错配了。

正确的逻辑表达式是!(a || b) && c。替换逻辑测试:

!(parseInt("@Model.Status") === @((int)Status.Active) || parseInt("@Model.Status") === @((int)Status.Expired) &&
  '@Model.EditMode' === 'True'

我对Kendo不熟悉,但是如果可以使用!==,则可以通过删除一些括号来简化表达式。根据{{​​3}} !(a || b)等效于!a && !b,因此,如果执行该替换,则得到!a && !b && c。如果我们也从!(parseInt("@Model.Status") === @((int)Status.Active))更改为parseInt("@Model.Status") !== @((int)Status.Active),那么我们最终得到:

parseInt("@Model.Status") !== @((int)Status.Active) && 
  parseInt("@Model.Status") !== @((int)Status.Expired) && 
  '@Model.EditMode' === 'True'