JavaScript未定义的变量检测:typeof ===" undefined"与双重感叹

时间:2014-05-13 09:18:40

标签: javascript boolean undefined typeof

检查JavaScript中的变量是否未定义时的常规做法如下:

var isUndefined=(typeof variableName==="undefined");


我最近遇到过使用两个感叹号来确定相同的逻辑:

var isUndefined=!!variableName;


<小时/> 这些方法可以互换使用是否安全?
两者在浏览器中是否兼容?
有没有理由不使用“!!”方法? (看起来更简洁易读)

1 个答案:

答案 0 :(得分:7)

  

交替使用这些方法是否安全?

没有。下面的详细信息,但即使您从第二个示例中删除其中一个!,它们也无法互换(其中两个,trueundefined,这是&n #39; t你想要从你所指定的变量名称中得到的东西。但这不是唯一的问题。

  

两者在浏览器中是否兼容?

是。它们中的每一个都可以跨浏但请参见上文:他们可靠不做同样的事情。

  

是否有任何理由不应该使用&#34; !!&#34;方法

是的,! (同样,不是!!0NaNnull提供相同的结果, ""falseundefined一样。

详细说明:

当你这样做时

var isUndefined = typeof variableName==="undefined";

()是不必要的),您正在对undefined进行非常具体的测试。 true只有undefined

相反,当你这样做时

var isUndefined = !variableName;

您未对undefined进行测试,您正在测试任何虚假值。假名值是我之前列出的值(0NaNnull""falseundefined)。对于其中任何一个,结果都是true

现在,如果您希望(例如)获得非null对象引用或undefined,那么!测试就可以了。但是,如果您确实需要知道某些内容是undefined,具体而言,您需要进行typeof测试。

此外,正如Felix Kling在问题评论中指出的那样,!测试将抛出ReferenceError如果变量根本没有定义(相对于被定义但具有值undefined),因为它试图读取变量的。如果您不确定该变量是否存在,则typeof测试是安全的,因为它不会尝试读取其值。