Javascript 是否有必要使用;“类型”;运算符检查全局变量是否存在?

Javascript 是否有必要使用;“类型”;运算符检查全局变量是否存在?,javascript,variables,properties,undefined,typeof,Javascript,Variables,Properties,Undefined,Typeof,当我编写依赖于从同一页引用的另一个脚本文件创建的对象的代码时,我经常发现自己必须测试是否存在某个全局变量或其他变量 我希望这样做的逻辑习语如下: if (window.myLibrary) myLibrary.someFunction(); 然而,在对stackoverflow进行了一些研究之后,一致认为正确的习惯用法是: if (typeof myLibrary != "undefined") myLibrary.someFunction(); 关于stackoverflow的几个回答中给

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

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

if (window.myLibrary) myLibrary.someFunction();
然而,在对stackoverflow进行了一些研究之后,一致认为正确的习惯用法是:

if (typeof myLibrary != "undefined") myLibrary.someFunction();
关于stackoverflow的几个回答中给出了这个成语,最突出的例子是:


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

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

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

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

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

if ('myLibrary' in window)

我想那只是我的偏好。为了澄清,即使window.myLibrary为“false”,也会计算true,因此您基本上要检查它是否已定义。

我倾向于使用第一个示例,除非有人可能会将库设置为“true”或类似的原因。是的,如果您的代码在其他人的环境中运行(即,您正在构建一个像JQuery这样的公共Javascript框架),那么您可能希望类型检查尽可能安全,以确保没有人误用库。但在我看来,Javascript中完美的类型安全性并没有那么重要,以至于您的所有代码都非常冗长,有时甚至难以阅读

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

if ('myLibrary' in window)

我想那只是我的偏好。为了澄清这一点,即使window.myLibrary为“false”,也会计算true,因此您基本上要检查它是否已定义。

您的第一个示例测试真实性,而第二个示例测试定义。对于这个场景,任何一个都可以,但是如果(myLibrary的类型==“函数”)在我所说的用例中,我只需要验证真实性,那么使用
可能更有意义。我想知道该页面上是否加载了另一个库,我想我可以假设,如果变量未解析为false,则加载了库。我问这个问题的原因之一是想看看这是否是一个可以接受的假设。我认为可以使用你的第一个例子。对于文字值更为重要,因为它们可能有错误的值,其中
if(val)
在检查定义时会显示不一致的结果。顺便说一下,我的第一条评论中有一个输入错误-如果你想非常具体,你可以使用
if(myLibrary&&typeof myLibrary.someFunction==“function”)
如果你只需要知道它是否正确,我想你的第一个解决方案就可以了。同样,特别是对于你的场景,第一个例子应该可以。您所包含的StackOverflow问题的答案基本上是一种检测变量是否定义的通用方法。如果要查看是否定义了实际变量,第一个示例将抛出一个错误。例如,
if(someLocalVar)
如果页面上根本没有声明名为“someLocalVar”的变量,就会抛出错误。在
窗口上进行测试
和全局范围不同我们的第一个示例测试真实性,而第二个测试定义。对于这个场景,任何一个都可以,但是如果(myLibrary的类型==“函数”)
在我所说的用例中,我只需要验证真实性,那么使用
可能更有意义。我想知道该页面上是否加载了另一个库,我想我可以假设,如果变量未解析为false,则加载了库。我问这个问题的原因之一是想看看这是否是一个可以接受的假设。我认为可以使用你的第一个例子。对于文字值更为重要,因为它们可能有错误的值,其中
if(val)
在检查定义时会显示不一致的结果。顺便说一下,我的第一条评论中有一个输入错误-如果你想非常具体,你可以使用
if(myLibrary&&typeof myLibrary.someFunction==“function”)
如果你只需要知道它是否正确,我想你的第一个解决方案就可以了。同样,特别是对于你的场景,第一个例子应该可以。您所包含的StackOverflow问题的答案基本上是一种检测变量是否定义的通用方法。如果要查看是否定义了实际变量,第一个示例将抛出一个错误。例如,
if(someLocalVar)
如果页面上根本没有声明名为“someLocalVar”的变量,就会抛出错误。在
window
上进行测试,全局范围因个人而异,我发现第二个if语句更清晰,但这也许可以解释为什么我要在周五晚上浏览stackoverflow;)就我个人而言,我觉得第二个if语句更清晰,但这也许可以解释为什么我