【问题标题】:JavaScript undefined variable detection: typeof==="undefined" vs double exclamationJavaScript 未定义变量检测:typeof==="undefined" vs 双感叹号
【发布时间】:2014-05-13 09:18:40
【问题描述】:

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

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


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

var isUndefined=!!variableName;



互换使用这些方法是否安全?
两者在浏览器之间是否同样兼容?
有什么理由不应该使用“!!”方法? (看起来更简洁易读)

【问题讨论】:

  • !!variableName 如果variableName 确实不存在(即没有var variableName 语句),将引发引用错误。 typeof variableName 不会抛出这样的错误。
  • @T.J.Crowder 哦,是的,删除了我的评论。 +1 给你的 :-)

标签: javascript boolean undefined typeof


【解决方案1】:

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

没有。下面的详细信息,但即使您从第二个示例中删除! 之一(其中两个,对于undefined,它将是true,这不是您似乎想要的您分配给的变量的名称)。但这不是唯一的问题。

两者在浏览器之间是否同样兼容?

是的。它们中的每一个都可以跨浏览器可靠地工作。但见上文:他们可靠地不会做同样的事情。

有什么理由不应该使用“!!”方法?

是的,! (同样,不是!!0NaNnull""false 给出相同的结果为undefined 做。

详情:

当你这样做时

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

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

相反,当你这样做时

var isUndefined = !variableName;

您不是在测试undefined,您是在测试任何虚假值。错误值是我之前列出的值(0NaNnull""falseundefined)。结果将是true 对于其中任何一个。

现在,如果您期望(例如)获得非null 对象引用或undefined,那么! 测试就可以了。但是,如果您真的需要知道某个东西是否是 undefined,具体来说,您需要 typeof 测试。

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

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2015-03-09
    • 2011-02-11
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多