我想检查变量是否已定义。例如,以下引发未定义的错误
alert( x );
如何捕获此错误?
我想检查变量是否已定义。例如,以下引发未定义的错误
alert( x );
如何捕获此错误?
Answers:
在JavaScript中,null
是一个对象。不存在的东西还有另一个价值undefined
。DOM null
在几乎所有无法在文档中找到某些结构的情况下都会返回,但是在JavaScript本身中undefined
是所使用的值。
第二,不,没有直接对等的内容。如果您确实要专门检查null
,请执行以下操作:
if (yourvar === null) // Does not execute if yourvar is `undefined`
如果要检查变量是否存在,则只能使用try
/ 来完成catch
,因为typeof
它将未声明的变量和声明为的变量undefined
等效。
但是,检查是否声明一个变量而不是undefined
:
if (yourvar !== undefined) // Any scope
以前,必须使用typeof
运算符来安全地检查未定义的内容,因为有可能undefined
像变量一样重新分配。原来的样子是这样的:
if (typeof yourvar !== 'undefined') // Any scope
undefined
可重新分配的问题已在2009年发布的ECMAScript 5中得到修复。现在,您可以安全地使用===
和!==
测试,undefined
而在不使用的情况下typeof
,它undefined
已经被只读了一段时间。
如果您想知道成员是否独立存在,但不在乎其值是什么:
if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance
如果您想知道变量是否为真:
if (yourvar)
真正测试变量是否唯一的唯一方法undefined
是执行以下操作。请记住,未定义是JavaScript中的对象。
if (typeof someVar === 'undefined') {
// Your variable is undefined
}
该线程中的其他一些解决方案会让您相信即使定义了变量,该变量仍未定义(例如,值为NULL或0)。
ReferenceError
。
undefined
javascript中的一个对象,是错误信息。这句话是否与您的答案相关?它是undefined
类型的值undefined
,分配给名为的全局标识符undefined
。
undefined
从ES5开始一直为只读。您可以使用if (x === undefined) {...}
或这样的速记安全地测试未定义内容:if (x === void 0)
。
从技术上讲,正确的解决方案是(我认为):
typeof x === "undefined"
有时您可能会变得懒惰并使用
x == null
但这允许未定义的变量x和包含null的变量x都返回true。
var x;
,然后typeof x;
您会得到"undefined"
与输入相同的信息typeof lakjdflkdsjflsj;
一个更简单,更速记的版本是:
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.');
}
}
您还可以使用三元条件运算符:
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);
var a = false;
呢?您应该检查是否a===undefined
改为
var x;
执行上述操作将引发错误
!a
测试true undefined
,而且还会测试0
and null
和true false
。这是非常不正确的,应删除。
我经常使用最简单的方法:
var variable;
if (variable === undefined){
console.log('Variable is undefined');
} else {
console.log('Variable is defined');
}
编辑:
如果不初始化变量,将引发异常“ Uncaught ReferenceError:变量未定义...”
Uncaught ReferenceError: variable is not defined
variable
由定义var variable;
。并且此代码段将variable
在本地范围内覆盖。它会破坏期望访问闭包或全局变量的逻辑。即var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
另一个潜在的“解决方案”是使用window
对象。在浏览器中时,它避免了参考错误问题。
if (window.x) {
alert('x exists and is truthy');
} else {
alert('x does not exist, or exists and is falsy');
}
undefined
。这不会那样做。
错误告诉您x
甚至不存在!尚未声明,与分配值不同。
var x; // declaration
x = 2; // assignment
如果声明了x
,则不会出错。您会收到一条警报,说undefined
是因为x
存在/已被声明但尚未分配值。
要检查变量是否已声明,可以使用typeof
,任何其他检查变量是否存在的方法都会引发与您最初遇到的错误相同的错误。
if(typeof x !== "undefined") {
alert(x);
}
这是在检查存储在中的值的类型x
。它只会返回undefined
时x
,如果它没有被申报或已被宣布和尚未分配。
typeof
运算符。
的void
操作者返回undefined
任何参数/表达传递给它。因此您可以根据结果进行测试(实际上,一些缩小程序将您的代码从更改undefined
为void 0
来保存几个字符)
例如:
void 0
// undefined
if (variable === void 0) {
// variable is undefined
}
typeof
,undefined
可以重新分配思维,这已经有大约十年了。
undefined
,因为上帝只知道是什么原因,无论如何,使用void 0
都会返回undefined
。
接受的答案是正确的。只是想添加一个选项。您也可以使用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
块,这有点混乱,因为它会创建块级范围。而且,当然,该示例已大大简化,可以回答所提出的问题,它没有涵盖错误处理的最佳实践;)。
我使用一个小函数来验证已声明的变量,这确实减少了我的javascript文件中的混乱情况。我添加了一个值检查,以确保该变量不仅存在,而且还被分配了一个值。第二个条件检查该变量是否也已实例化,因为如果已定义该变量但未实例化(请参见下面的示例),则在尝试在代码中引用它的值时,它仍然会引发错误。
未实例化- 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 }
return typeof el !== "undefined" && typeof el.val() !== "undefined"