协慌网

登录 贡献 社区

JavaScript 检查变量是否存在(定义 / 初始化)

检查变量是否已初始化的哪种方法更好 / 更正? (假设变量可以包含任何内容(字符串,整数,对象,函数等))

if (elem) { // or !elem

要么

if (typeof(elem) !== 'undefined') {

要么

if (elem != null) {

答案

你想要typeof运算符 。特别:

if (typeof variable !== 'undefined') {
    // the variable is defined
}

typeof运算符将检查变量是否确实未定义。

if (typeof variable === 'undefined') {
    // variable is undefined
}

与其他运算符不同, typeof运算符在与未声明的变量一起使用时不会抛出ReferenceError异常。

但是,请注意typeof null将返回"object" 。我们必须小心避免将变量初始化为null的错误。为了安全起见,这是我们可以使用的:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

有关使用严格比较===而不是简单等式==更多信息,请参阅:
应该在 JavaScript 比较中使用哪个等于运算符(== vs ===)?

在 JavaScript 中,可以定义变量,但保持值undefined ,因此最常见的答案在技术上不正确,而是执行以下操作:

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

这可能足以满足您的目的。以下测试具有更简单的语义,这使得更容易精确描述代码的行为并自己理解(如果您关心这些事情):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

当然,这假设您在浏览器中运行(其中window是全局对象的名称)。但是,如果你正在使用像这样的全局变量,你可能在浏览器中。主观上, 'name' in window使用'name' in window风格上与使用window.name引用全局变量一致。访问全局变量作为window属性而不是变量允许您最小化您在代码中引用的未声明变量的数量(为了利用 linting),并避免全局被局部变量遮蔽的可能性。此外,如果全球化使你的皮肤爬行,你可能会感觉更舒服只用这个相对长的棍子接触它们。