如何在JavaScript中检查未定义的变量

Jin*_*esh 879 javascript variables undefined

我想检查变量是否已定义.例如,以下引发了未定义的错误

alert( x );
Run Code Online (Sandbox Code Playgroud)

我怎么能抓到这个错误?

Nat*_*ium 1647

在JavaScript中,null是一个对象.对于不存在的事物,还有另一个价值undefined.null几乎所有在文档中都找不到某些结构的情况下,DOM都会返回,但在JavaScript本身undefined就是使用的值.

第二,不,没有直接的等价物.如果您真的想要专门检查null,请执行以下操作:

if (yourvar === null) // Does not execute if yourvar is `undefined`
Run Code Online (Sandbox Code Playgroud)

如果要检查变量是否存在,那么只能用try/ 来完成catch,因为typeof它将处理未声明的变量和使用undefined等效值声明的变量.

但是,要检查变量是否已声明不是undefined:

if (typeof yourvar !== 'undefined') // Any scope
Run Code Online (Sandbox Code Playgroud)

如果您知道该变量存在,并想检查其中是否存储了任何值:

if (yourvar !== undefined)
Run Code Online (Sandbox Code Playgroud)

如果您想知道成员是否存在独立但不关心其价值是什么:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance
Run Code Online (Sandbox Code Playgroud)

如果你想知道变量是否真实:

if (yourvar)
Run Code Online (Sandbox Code Playgroud)

资源

  • undefined不是保留字; 你(或其他人的代码)可以做"undefined = 3",这将打破你的两个测试. (70认同)
  • 我认为他指的是一个尚未分配的变量.例如:var foo; // foo存在但没有值 (35认同)
  • "在JavaScript中,null是一个对象.",这实际上并不正确,并且可能,这种误解的罪魁祸首是`typeof`运算符(`typeof null =='object'`).[`null`值](http://es5.github.com/#x4.3.11)是[原始值](http://es5.github.com/#primitive_value),这是唯一的值[Null type](http://es5.github.com/#x4.3.12). (11认同)
  • "如果您知道该变量存在但不知道其中是否存有任何值" - 是吧?! (6认同)
  • 嗯...我刚刚注意到"源"链接:这整个帖子都是来自邮件列表的直接引用,并且应该进行编辑以使其更清晰,因为原始作者无法澄清. (3认同)

Mic*_*les 336

真正测试变量是否的唯一方法undefined是执行以下操作.请记住,undefined是JavaScript中的一个对象.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}
Run Code Online (Sandbox Code Playgroud)

此线程中的其他一些解决方案将使您相信变量未定义,即使它已被定义(例如,值为NULL或0).

  • 因为这里的问题不是未定义的,所以应该输入someVar!=='undefined',对吗? (17认同)
  • 唯一没有产生`ReferenceError`的测试. (2认同)
  • 这段代码是正确的,但我认为`undefined`是javascript中的一个对象是错误的信息.这句话是否与您的答案有关?它是`undefined`类型的值'undefined`,分配给名为`undefined`的全局标识符. (2认同)

Jas*_*n S 66

从技术上讲,正确的解决方案是(我相信):

typeof x === "undefined"
Run Code Online (Sandbox Code Playgroud)

你有时会变得懒惰和使用

x == null
Run Code Online (Sandbox Code Playgroud)

但是这允许未定义的变量x和包含null的变量x都返回true.


Dmi*_*kov 20

更简单,更简便的版本是:

if (!x) {
   //Undefined
}
Run Code Online (Sandbox Code Playgroud)

要么

if (typeof x !== "undefined") {
    //Do something since x is defined.
}
Run Code Online (Sandbox Code Playgroud)

  • 如果从函数调用中设置x,则第一个代码段可能不正确.像x = A(); 如果A没有返回任何内容,默认情况下它将返回"undefined".做一个!x将是真的,这在逻辑上是正确的.但是,如果A()返回0,那么!x应为false,因为x = 0.但是在JS中,!0也是如此. (26认同)
  • 请摆脱第一个片段,这很糟糕 (5认同)
  • @AlejandroSilva很抱歉迟到的回复.这不起作用,因为typeof返回一个字符串,因此它将为未定义的变量返回'undefined',而后者将评估为TRUE,从而导致定义的var的误报. (2认同)
  • 其他评论指出第一个例子不好,但不清楚为什么。因此,对于任何新编码人员: !x 不会测试 x 是否已定义,而是测试它是否为真。字符串、布尔真值和正数都是真值(我可能会忘记一些事情),但其他可能有效的值,如 0、布尔假值和空字符串都不是真值。第一个示例适用于特定用例(例如,如果您可以将空视为未定义,则测试字符串),但由于许多地方不会,因此不应将其视为默认检查方式。 (2认同)

Joe*_*Joe 15

我经常这样做:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 考虑将"=="更改为"===".如果你调用doSomething(null),你也会得到警报.除非那是你想要的. (9认同)
  • 你当然可以。尝试调用不带参数的函数。 (2认同)

Ale*_*lex 15

抱歉,死灵术,但这里的大多数答案混淆了“未定义”和“未定义”

  1. 未定义- 声明了变量,但其值未定义。

  2. 未定义- 甚至没有声明变量。

检查这两种情况的唯一安全方法是使用typeof myVar === 'undefined'

myVar === undefined仅检查案例编号 (1)。myVar如果案例号 (2)甚至没有声明,它仍然会抛出“myVar 未定义” 。OP 特别询问“甚至没有定义”的情况(2)。

PS 我确实知道“案例 2”在现代 ES6 世界中变得越来越罕见,但一些旧的遗留组件仍然存在于过去。


JBa*_*lin 5

该错误告诉您x\xe2\x80\x99 根本不存在!它还没有声明\xe2\x80\x99,这与赋值不同。

\n\n
var x; // declaration\nx = 2; // assignment\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您声明了x,则\xe2\x80\x99不会收到错误。您将收到一条警报,指出“undefined因为x存在/已声明,但尚未为\xe2\x80\x99 分配值”。

\n\n

要检查变量是否已声明,您可以使用typeof,检查变量是否存在的任何其他方法都会引发与最初相同的错误。

\n\n
if(typeof x  !==  "undefined") {\n    alert(x);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是检查存储在 中的值的类型xundefined仅当x尚未声明\xe2\x80\x99 或声明但尚未分配时,它才会返回。

\n


sva*_*rog 5

void操作者返回undefined任何参数/表达传递给它。所以你可以测试结果(实际上一些缩小器将你的代码从undefined改为void 0以保存几个字符)

例如:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}
Run Code Online (Sandbox Code Playgroud)