【发布时间】: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