具有多个ifs的javascript if条件

具有多个ifs的javascript if条件,javascript,Javascript,我在每个页面上运行一个UI组件,在其中一个页面上,有一个额外的功能链接到它。UI组件有一个名为MyValue的布尔值,额外功能有一个名为ExtraObject的对象,它的一个属性是一个名为ExtraBool的布尔值 我想测试MyValue是否为true,ExtraObject.ExtraBool是否为false,但仅当ExtraObject存在时。这样,如果我在没有ExtraObject的页面上,就不会有错误 我试过这个: if (MyValue === true &&

我在每个页面上运行一个UI组件,在其中一个页面上,有一个额外的功能链接到它。UI组件有一个名为
MyValue
的布尔值,额外功能有一个名为
ExtraObject
的对象,它的一个属性是一个名为
ExtraBool
的布尔值


我想测试MyValue是否为true,ExtraObject.ExtraBool是否为false,但仅当ExtraObject存在时。这样,如果我在没有ExtraObject的页面上,就不会有错误

我试过这个:

if (MyValue === true && 
    (typeof ExtraObject === undefined || ExtraObject.ExtraBool === false)) {...}
我应该如何重写这个

目前,我一直得到“ExtraObject未定义错误”

谢谢。

应该是:

typeof ExtraObject === "undefined"
if (MyValue && !ExtraObject.ExtraBool) {}
typeof
以字符串形式返回表达式的类型,因此需要将名称
“undefined”
与结果进行比较

依我看,你的条件有点太明确了。我会选择短一点的:

if (MyValue && !(ExtraObject && ExtraObject.ExtraBool)) {...}

如果您正在使用自己的GUI代码进行通信,则可以假定类型与预期的相同。JavaScript中的类型检查相当麻烦,因此,如果您知道要处理的是什么,那么就不那么明确了。(但这不适用于用户输入。永远不要相信用户输入。)

逻辑不太正确:

if (MyValue && ExtraObject && !ExtraObject.ExtraBool) { ... }
我猜
null
将是
ExtraObject
不应该有的值;也就是说,我假设你的条件是,它应该是一个对象的引用

因此,当
MyValue
为“truthy”时,
ExtraObject
为对真实对象的引用,并且该对象上的属性
ExtraBool
为“falsy”时,我所写的条件将为真

有时有必要对布尔常量进行显式比较,但我认为这是一种代码味道。(当然,仅仅检查真假也可能是危险的…)

编辑如果您的要求是当
MyValue
为true时表达式为true,并且
ExtraObject
不是对对象的引用,或者它的
ExtraBool
属性为true,则我会这样写:

if (MyValue && (!ExtraObject || !ExtraObject.ExtraBool)) { ... }
哪个“更好”取决于个人偏好和经验。

真理表时间

if ((MyValue === true) && (typeof ExtraObject === undefined || ExtraObject.ExtraBool === false)) {}
A是
MyValue
*
B是
窗口。外部对象
***
C是
ExtraObject.ExtraBool

A B C | O
------+--
0 0 0 | 0
0 0 1 | 0
0 1 0 | n/a***
0 1 1 | 0
1 0 0 | 1
1 0 1 | n/a***
1 1 0 | 1
1 1 1 | 0
通过这些值,我们发现产生
O
的最简单方程是:

A && !C
var extraBool = window.ExtraObject && ExtraObject.ExtraBool;
因此,您的代码应该是:

typeof ExtraObject === "undefined"
if (MyValue && !ExtraObject.ExtraBool) {}
但当然,您提到如果未定义
ExtraObject
,则不希望遇到问题:

var extraBool = window.ExtraObject ? ExtraObject.ExtraBool : false;
if (MyValue && !extraBool) {}
编写
extraBool
的另一种方法是:

A && !C
var extraBool = window.ExtraObject && ExtraObject.ExtraBool;
然后,您可以将其内联:

if (MyValue && !(window.ExtraObject && ExtraObject.ExtraBool)) {}
的另一种选择!(a和b)
!a | | |!b
,这意味着:

if (MyValue && (!window.ExtraObject || !ExtraObject.ExtraBool)) {}
这也是正确的

*它可以是
MyValue===true
,这取决于您需要的严格程度
**或者
typeof ExtraObject!='未定义的“

***实际上不可能取消定义
ExtraObject
并访问
ExtraObject.ExtraBool


您实际上不需要将布尔值与
true
false
进行比较;只需参考变量或其逻辑补足符(
!ExtraObject.ExtraBool
)@Pointy,尽管我怀疑有人会遇到这种低级布尔逻辑问题,但有可能
MyValue
需要为
true
,但可以有其他值,如
1
,或
'false'
,这里需要执行严格的相等比较。看起来OP在
if
语句中缺少一个接近的paren…确实!感谢您的回答。再次修复,因此如果
MyValue
为true且
ExtraObject
未定义,则条件将计算为
true
。必须检查您对其他答案的评论以进行验证。“如果MyValue为true,如果ExtraObject.ExtraBool为false,但仅当ExtraObject存在”无论如何,您提供的测试引号中未定义项的解决方案是好的。我更喜欢易于阅读的长代码,最后我通过google closure compiler将其输入并优化输出。另一种方法是只测试
ExtraObject===undefined
,但是您可能需要在本地重新定义
undefined
,以确保它实际上是
undefined
。不,如果ExtraObject未定义且MyValue==true,则条件为metWell@frenchie OK,但您的问题措词不正确。在哪里?“如果MyValue为true,如果ExtraObject.ExtraBool为false,但仅当ExtraObject存在时,您的措辞中“没有”或“没有”;然而,我同意这并不是错误的,但它是模糊的,因为不清楚“但仅”部分与什么有关。“但仅”部分与ExtraObject有关:我们正在测试ExtraObject。ExtraBool===false,仅当ExtraObject存在时。好的,谢谢!我看过了,我认为你的方式比我在“未定义”测试中做的要好。我对你的答案投了赞成票。不,实际上你的答案在“严格模式”下不起作用。因此,我使用“未定义”测试的想法实际上是好的@frenchie,哦,对了,忘了将其设置为
窗口。ExtraObject
,在这种情况下,它将正常工作。啊,是的!全局变量污染全局范围是有原因的。谢谢