我想检查变量是否已定义。例如,以下引发了一个未定义的错误
alert( x );
如何捕获此错误?
在JavaScript中,null是一个对象。不存在的东西还有另一个值,undefined。DOM在几乎所有无法在文档中找到某些结构的情况下都返回null,但在JavaScript本身中undefined是使用的值。
null
undefined
其次,不,没有直接等价。如果您真的想专门检查null,请执行:
if (yourvar === null) // Does not execute if yourvar is `undefined`
如果你想检查一个变量是否存在,那只能用try/catch来完成,因为typeof将把一个未声明的变量和一个声明值为undefined的变量视为等价的。
try
catch
typeof
但是,要检查变量声明和是否不是undefined:
if (yourvar !== undefined) // Any scope
以前,有必要使用typeof运算符来安全地检查未定义,因为可以像变量一样重新分配undefined。旧方法如下所示:
if (typeof yourvar !== 'undefined') // Any scope
2009年发布的ECMAScript 5修复了undefined可重新分配的问题。您现在可以安全地使用===和!==来测试undefined,而无需使用typeof,因为undefined已经只读了一段时间。
===
!==
如果你想知道一个成员是否独立存在,但不关心它的值是什么:
if ('membername' in object) // With inheritanceif (object.hasOwnProperty('membername')) // Without inheritance
如果你想知道一个变量是否为Truthy:
if (yourvar)
来源
从技术上讲,正确的解决方案是(我相信):
typeof x === "undefined"
你有时会变得懒惰和使用
x == null
但这允许未定义的变量x和包含null的变量x返回true。
一个更简单、更快捷的版本是:
if (!x) {//Undefined}
或
if (typeof x !== "undefined") {//Do something since x is defined.}
我经常做:
function doSomething(variable){var undef; if(variable === undef){alert('Hey moron, define this bad boy.');}}
真正测试变量是否为undefined的唯一方法是执行以下操作。请记住,未定义是JavaScript中的对象。
if (typeof someVar === 'undefined') {// Your variable is undefined}
这个线程中的一些其他解决方案会让您相信变量是未定义的,即使它已经定义了(例如,值为NULL或0)。
我经常用最简单的方法:
var variable;if (variable === undefined){console.log('Variable is undefined');} else {console.log('Variable is defined');}
编辑:
如果不初始化变量,则会抛出异常“未捕获的引用错误:变量未定义…”
你也可以使用三元条件运算符:
var a = "hallo world";var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);
//var a = "hallo world";var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);
我们可以检查undefined如下
var x; if (x === undefined) {alert("x is undefined");} else {alert("x is defined");}
接受的答案是正确的。只是想再添加一个选项。您也可以使用try ... catch块来处理这种情况。一个奇怪的例子:
try ... catch
var a;try {a = b + 1; // throws ReferenceError if b is not defined}catch (e) {a = 1; // apply some default behavior in case of error}finally {a = a || 0; // normalize the result in any case}
注意catch块,这有点混乱,因为它创建了一个块级范围。当然,这个例子在回答问题时非常简化,它没有涵盖错误处理的最佳实践;)。
另一个潜在的“解决方案”是使用window对象。它避免了浏览器中的引用错误问题。
window
if (window.x) {alert('x exists and is truthy');} else {alert('x does not exist, or exists and is falsy');}
错误告诉你x根本不存在!它不是宣布,这与分配是一个值不同。
x
var x; // declarationx = 2; // assignment
如果您声明了x,您将不会收到错误。您会收到一个显示undefined的警报,因为x存在/已声明但尚未分配值。
要检查变量是否已声明,您可以使用typeof,任何其他检查变量是否存在的方法都会引发与最初相同的错误。
if(typeof x !== "undefined") {alert(x);}
这是检查存储在x中的值的类型。只有当x尚未声明时,它才会返回undefined,或者如果它已声明已经且尚未分配。
void运算符为传递给它的任何参数/表达式返回undefined。所以你可以根据结果进行测试(实际上一些小型字符将你的代码从undefined更改为void 0以保存几个字符)
void
void 0
例如:
void 0// undefined if (variable === void 0) {// variable is undefined}
我使用一个小函数来验证变量是否已声明,这确实减少了我的javascript文件中的混乱量。我添加了一个值检查以确保变量不仅存在,而且还被赋予了一个值。第二个条件检查变量是否也已被实例化,因为如果变量已定义但未实例化(参见下面的示例),如果您尝试在代码中引用它的值,它仍然会抛出错误。
未实例化-var my_variable;实例化-var my_variable = "";
var my_variable;
var my_variable = "";
function varExists(el) {if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) {return true;} else {return false;}}
然后,您可以使用条件语句来测试变量是否已经定义并像这样实例化…
if ( varExists(variable_name) ) { // checks that it DOES exist }
或者测试它是否还没有被定义和实例化…
if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
只需做如下操作:
function isNotDefined(value) {return typeof value === "undefined";}
并称其为:
isNotDefined(undefined); //return trueisNotDefined('Alireza'); //return false
对不起,巫术,但这里的大多数答案混淆了“未定义”和“未定义”
未定义-声明了一个变量,但它的值未定义。
未定义-甚至没有声明变量。
检查这两种情况的唯一安全方法是使用typeof myVar === 'undefined'
typeof myVar === 'undefined'
myVar === undefined只会检查案例编号(1)。如果myVar甚至没有声明,它仍然会为案例编号(2)抛出“myVar is not default”。OP特别询问“未定义”的案例(2)。
myVar === undefined
myVar
附注:我知道“case 2”在现代ES6世界中变得越来越罕见,但一些旧的遗留组件仍然存在于过去。