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

Pau*_*aul 4 javascript boolean typeof undefined

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

var isUndefined=(typeof variableName==="undefined");
Run Code Online (Sandbox Code Playgroud)


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

var isUndefined=!!variableName;
Run Code Online (Sandbox Code Playgroud)



交替使用这些方法是否安全?
两者在浏览器中是否兼容?
是否有人不应该使用"!!" 方法?(看起来更简洁易读)

T.J*_*der 7

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

不.下面详细说明,但是即使你!从第二个例子中删除了其中一个,它们也是不可互换的(其中两个,它将是truefor undefined,这不是你想要的变量你想要的名字')重新分配).但这不是唯一的问题.

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

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

是否有人不应该使用"!!" 方法?

是的,! (同样,没有!!)给出了相同的结果为0,NaN,null,"",和false因为它为undefined.

细节:

当你这样做

var isUndefined = typeof variableName==="undefined";
Run Code Online (Sandbox Code Playgroud)

(这()是不必要的),你正在做一个非常具体的测试undefined.它只会true用于undefined.

相比之下,当你这样做

var isUndefined = !variableName;
Run Code Online (Sandbox Code Playgroud)

你没有测试undefined,你正在测试任何虚假的价值.该falsey值是我在前面列出的那些(0,NaN,null,"",false,和undefined).结果将是true他们中的任何一个.

现在,如果你希望(例如)得到一个非null对象的引用或者undefined,该!测试只是罚款.但是,如果你真的需要知道某些东西undefined,特别是你想要typeof测试.

另外,正如Felix Kling在对问题的评论中指出的那样,如果变量根本没有定义(而不是被定义但是具有值),!测试将抛出一个,因为它试图读取变量的.的,如果你不知道的变量是否存在可言,因为它不尝试读取其值试验是安全的.ReferenceErrorundefinedtypeof