2015-09-05 61 views
1

我的代码中有一些奇怪的不一致的错误,很难重现。它出现了,但如果我再次运行相同的序列,它就会消失。如果我尝试调试它,它会消失。对undefined var进行条件检查是做什么的?

不管怎么说,我想知道,如果下面可能是罪魁祸首 假设我有以下代码

var myBoolean; // undefined 
if(!myBoolean) { 
    doX(); 
} else { 
    doY(); 
} 

的问题是,在上面的代码,它运行DOX()或DOY()?

当我测试它,它似乎运行doX(),但我知道有一个更正确的方式来检查未定义。

if(typeof myBoolean == 'undefined' || !myBoolean) { ... 

所以我的问题是,可能检查的方式不当myBoolean在我的代码会导致非决定论?只是我不得不在很多地方改变这些代码,我只想在做任何事之前知道这是否是问题。

+0

所以标题将更好地沿着东西*我如何测试只有未定义?* –

+0

你甚至不需要检查变量的类型以知道它是否为undefined,只需检查它的值:if(myBoolean === undefined){...' – LostMyGlasses

+0

这是显然是过分简化了我的代码。在实际的代码中,myBoolean可以是未定义的,true或false的。 – kane

回答

4

表达!myBooleanmyBooleanundefined总是是真实的。但是,它将0,"",false,NaNnull时为true。

这是否正常取决于您的程序中的情况。你写的示例代码显然是毫无意义的;由于myBoolean肯定会在undefinedif声明中,if可以完全消除。在实际情况中,您可能知道变量或对象属性将为undefined或对象引用。

许多人在防守中作为练习代码,所以这样的程序员可能会包含更明确的测试。 大部分时间,这是真的,价值nullundefined在典型的编码情况相同的基本含义,因此,如果是这样的话,那么它的安全写

if (myBoolean == null) 

==比较将只有当真正的myBooleanundefinednull,而不是在任何其他情况下。换句话说,

if (myBoolean == null) 

实际上是相同的

if (myBoolean === undefined || myBoolean === null) 

你可以用你喜欢哪个当然:)

+0

只是好奇,为什么类型强制'myBoolean == null'而不是三等于? – Vidul

+0

@ВидулПетров因为当==的一个操作数为null时,如果另一个操作数是undefined或null,则==操作数会返回true。我会为答案添加一个简短的解释。 – Pointy

+0

我知道,只是想知道为什么简洁类型强制代替'myBoolean === null || myBoolean === undefined'? – Vidul

相关问题