【问题标题】:Is it necessary to use the "typeof" operator to check if a global variable exists?是否需要使用“typeof”运算符来检查全局变量是否存在?
【发布时间】:2013-05-12 19:04:20
【问题描述】:

当我编写依赖于从同一页面引用的另一个脚本文件创建的对象的代码时,我经常发现自己必须测试某个全局变量或其他变量的存在。

我希望这样做的逻辑成语如下:

if (window.myLibrary) myLibrary.someFunction();

然而,在对stackoverflow进行一些研究之后,共识似乎是正确的成语是这样的:

if (typeof myLibrary != "undefined") myLibrary.someFunction();

这个成语在stackoverflow的几个答案中都有给出,最突出的例子是这个:

How can i check whether a variable is defined in javascript

但是,我找不到任何解释为什么第二个版本更可取。对它的所有建议都采用“仅使用它”的形式。有人可以解释一下为什么使用 typeof 运算符优于通过将其作为窗口对象的属性来检查对象吗?

【问题讨论】:

  • 您的第一个示例测试真实性,而第二个示例测试定义。对于这种情况,任何一个都可以,但使用if (typeof myLibrary === "function") 可能更有意义
  • 在我说的用例中,我只需要验证真实性。我想知道该页面上是否加载了另一个库,并且我认为我可以假设如果变量没有解析为 false 则加载了库。我问这个问题的原因之一是看看这是否是一个可以接受的假设。
  • 我认为使用您的第一个示例很好。这对于文字值更重要,因为它们可能具有错误值,其中if (val) 在检查定义时会显示不一致的结果。顺便说一句,我在第一条评论中有一个错字——如果你想非常具体,你可以使用if (myLibrary && typeof myLibrary.someFunction === "function")
  • 如果您只需要知道它是否真实,我认为您的第一个解决方案就可以了。
  • 再次,针对您的场景,第一个示例应该没问题。您包含的 StackOverflow 问题的答案基本上是一种检测变量是否已定义的通用方法。如果您想查看一个实际的变量 是否已定义,那么您的第一个示例会抛出一个错误。例如,如果页面上根本没有声明名为“someLocalVar”的变量,if (someLocalVar) 将引发错误。测试window,全局作用域不同

标签: javascript variables properties undefined typeof


【解决方案1】:

我倾向于选择第一个示例,除非有一些非常令人信服的理由可以将库设置为“true”或类似的东西。是的,如果您的代码在其他人的环境中运行(即,您正在构建像 JQuery 这样的公共 Javascript 框架),您可能希望通过类型检查尽可能安全,以确保有人不会滥用该库。但在我看来,Javascript 中完美的类型安全并不是那么重要,以至于你的所有代码都非常冗长,有时难以阅读。

我也喜欢链接问题的答案;你可以使用

if ('myLibrary' in window)

我认为这只是偏好。澄清一下,即使 window.myLibrary 为“假”,它也会评估为真,因此您基本上是在检查它是否已被定义。

【讨论】:

  • 就个人而言,我发现第二个 if 语句更清晰,但也许这可以解释为什么我要花一个周五晚上浏览 stackoverflow ;)
【解决方案2】:

myLibrary 可能存在,但设置为 0 或 false 在这种情况下,第一个示例将假定它根本不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多