当我编写的代码依赖于从同一页面引用的另一个脚本文件创建的对象时,我经常发现自己必须测试某个全局变量或其他变量的存在。
我希望这样做的逻辑习语如下:
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运算符优于通过将其作为窗口对象的属性引用来检查对象?
答案 0 :(得分:4)
myLibrary可以存在,但可以设置为0或false,在这种情况下,第一个示例将假设它根本不存在。
答案 1 :(得分:3)
我倾向于选择第一个例子,除非有一些非常令人信服的理由为什么有人可能会将库设置为“true”或类似的东西。是的,如果您的代码在其他人的环境中运行(即,您正在构建一个像JQuery这样的公共Javascript框架),您可能希望通过类型检查尽可能安全,以确保某人不会滥用该库。但在我看来,Javascript中完美的类型安全并不是那么重要,以至于使你的所有代码都非常冗长,偶尔难以阅读。
我也很喜欢这个相关问题的答案;你可以用
if ('myLibrary' in window)
我认为这只是偏好。澄清一下,即使window.myLibrary为'false',也会评估为true,所以你基本上都要检查它是否已经定义了。