检查javascript中是否存在变量

Kir*_*lev 64 javascript

我知道在javascript中有两种方法可以确定变量是否存在而不是null(false,empty):

1) if ( typeof variableName !== 'undefined' && variableName )

2) if ( window.variableName )

哪一个更受欢迎,为什么?

aps*_*ers 106

如果访问变量名称将不会生成变量,则声明变量ReferenceError.表达式typeof variableName !== 'undefined'只会出现 false在以下两种情况中的一种:

  • 变量未声明(即var variableName范围内没有),
  • 的变量声明并且其值是undefined(即,变量的未定义)

否则,比较评估为true.

如果你真的想测试一个变量是否被声明,你需要通过尝试引用它来产生catch任何变量ReferenceError:

var barIsDeclared = true; 
try{ bar; }
catch(e) {
    if(e.name == "ReferenceError") {
        barIsDeclared = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只想测试声明的变量的值是否既不undefinednull,那么您只需测试它:

if (variableName !== undefined && variableName !== null) { ... }
Run Code Online (Sandbox Code Playgroud)

或者等效地,使用非严格的相等性检查null:

if (variableName != null) { ... }
Run Code Online (Sandbox Code Playgroud)

操作中的第二个示例和右手表达式都&&测试值是否为"falsey",即它是否false在布尔上下文中强制执行.这些值包括null,false,0,和空字符串,并不是所有的你可能要放弃.


Dav*_*d L 20

值得注意的是,'undefined'是一个完全有效的值,用于保存变量.如果要检查变量是否存在,

if (window.variableName)
Run Code Online (Sandbox Code Playgroud)

是一个更完整的检查,因为它验证变量实际上已被定义.但是,这仅在保证变量是对象时才有用!另外,正如其他人所指出的,如果variableName的值为false,0,''或null,则也可能返回false.

也就是说,这对我们的日常用途来说通常是不够的,因为我们通常不希望有不确定的价值.因此,您应首先检查变量是否已定义,然后使用typeof运算符断言它未定义,正如Adam指出的那样,除非变量确实未定义,否则不会返回undefined.

if ( variableName  && typeof variableName !== 'undefined' )
Run Code Online (Sandbox Code Playgroud)

  • `if(window.variableName)`有一个主要缺陷,因为它会对**已定义的任何东西返回假阴性,但是是假的.因此,任何"false","0","","null"或其他变量都会产生错误的结果. (5认同)

Fiz*_*han 10

如果要检查是否已定义变量(例如v)且不是null:

if (typeof v !== 'undefined' && v !== null) {
    // Do some operation  
}
Run Code Online (Sandbox Code Playgroud)

如果你要检查所有falsy值,如:undefined,null,'',0,false:

if (v) {
   // Do some operation
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lov 7

我正在写一个答案只是因为我没有足够的声誉来评论apsillers接受的答案.我同意他的回答,但是

如果你真的想测试变量是否未声明,你需要捕获ReferenceError ...

不是唯一的方法.一个人可以做到:

this.hasOwnProperty("bar")
Run Code Online (Sandbox Code Playgroud)

检查当前上下文中是否声明了变量.(我不确定,但调用hasOwnProperty也可能比引发异常更快/更有效)这仅适用于当前上下文(不适用于整个当前范围).