我想检查变量是否被定义。例如,以下引发了一个未定义的错误
如何捕获此错误?
- http://stackoverflow.com/questions/519145/how to check wheth‌&误8203;er-a-javascript-vari‌&;able defined/519157诳‌&误8203;519157
- 看起来这是一个祖父:stackoverflow.com/questions/1485840/…stackoverflow.com/questions/2647867/…-很好的爷爷可能是:stackoverflow.com/questions/27509/…
- 这不是已标记副本的副本。可变分辨率和对象属性分辨率是非常不同的。更好的复制是如何检查javascript中是否存在变量?.
- 您的错误是由于变量未声明。大多数答案都集中在作业上。更多信息请参阅我的答案。此外,它们中的许多错误地声明空值和未定义值是JavaScript中的对象。它们是原语,而不是物体…
在javascript中,null是一个对象。对于不存在的事物还有另一个价值,undefined。对于几乎所有在文档中找不到某些结构的情况,DOM都返回null,但在javascript本身中,undefined是所使用的值。
第二,不,没有直接等价物。如果您真的想检查null的具体内容,请执行以下操作:
1
| if (yourvar === null) // Does not execute if yourvar is `undefined` |
如果要检查变量是否存在,则只能使用try/catch,因为typeof会将未声明的变量和用undefined值声明的变量视为等效变量。
但是,要检查变量是否已声明且不是undefined:
1
| if (typeof yourvar !== 'undefined') // Any scope |
注意,这是胡说,因为可能有一个名为undefined的变量:
1
| if (yourvar !== undefined) |
如果您想知道一个成员是否独立存在,但不关心它的价值是什么:
1 2
| if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance |
如果你想知道一个变量是否真实:
来源
- 未定义不是保留字;您(或其他人的代码)可以执行"Undefined=3",这将中断两个测试。
- "如果你知道变量存在,但不知道其中是否存储了任何值"--嗯?!
- 我认为他指的是一个声明的变量,这个变量没有赋值给。例如:var foo;//foo存在,但没有值
- 六羟甲基三聚氰胺六甲醚。。。我刚刚注意到"来源"链接:这篇文章是邮件列表中的直接引述,可能需要编辑以使其更清晰,因为原始作者无法澄清。
- 另外,据我所知,"如果你知道变量存在"部分与前一部分没有区别。下一节("如果您想知道成员是否独立存在…")是正确的。
- "在javascript中,空值是一个对象。"事实上,这不是真的,而且,这种误解的罪魁祸首可能是typeof操作符(typeof null == 'object')。null值是原始值,它是空类型的唯一值。
- 对于全球范围的案例,您不需要询问window.hasOwnProperty('varname')吗?否则,可能是varname已经存在,但有人暂时将其设置为undefined。
- 空不是对象
- 使用if(!!yourvar)不会更好吗?
- 为什么有些是前后颠倒的?就像在undefined != yourvar和'window['varname']中一样!=未定义的?
- 是否可以包装"你的车!"undefined"转换成某种函数?如果没有声明,我甚至无法将"yourvar"传递到函数中。
- 和可选::检查所有变量::尝试一些var.x x x.x x x x='t';catch(e)x='f';console.debug(x);
- @米歇莱尔为什么我不能只做if (yourvar)
- 你所说的‘没有一个被命名为未定义的常量’是什么意思?`
- @Bobobobo"Netscape直到Navigator 3…"才支持该类型的运算符。jscript 2.0中引入了void,jscript 1.0中引入了typeof。
- 从w3schools-x==undefined检查未定义的变量。
- #1了解真实评估(!myvar或==或逻辑运算符)是NaN。南不等于自己。它也不松散地评价为真或假。如果与可以返回Nan的东西一起工作,请记住这一点。因为南变得很奇怪。幸运的是,它往往会暴露自己(例如,NaN && false返回NaN)。isNaN是您想要比较的内置函数。
- 未定义,因为值没有顶点,所以x==未定义
要真正测试变量是否为undefined,唯一的方法是执行以下操作。记住,未定义是JavaScript中的一个对象。
1 2 3
| if (typeof someVar === 'undefined') {
// Your variable is undefined
} |
这个线程中的其他一些解决方案会让您相信变量是未定义的,即使它已经被定义了(例如,值为空或0)。
- 因为问题没有定义,这里应该是somevar类型!=='未定义',对吗?
- 实际上,我不认为未发现是一个对象,请先查看documentation first developer.mozilla.org/en-us/docs/web/javascript/data-structu‌&8203;res
- 唯一不产生ReferenceError的测试。
- 这段代码是正确的,但我认为在javascript中说undefined是一个对象是错误的信息。这句话和你的回答有关吗?它是一个undefined类型的值undefined,分配给名为undefined的全局标识符。
- 这似乎比W3schools.com给出的答案更安全:(x === undefined)。正如在另一条评论中指出的,可以重新定义undefined的值,该测试将失败。但是,使用这个答案中给出的示例,这不是问题。
- undefined不是一个对象。typeof null为'object',typeof undefined为'undefined'。
- 这是JS中为数不多的事情之一,但是typeof不一定会显示出某个东西不是对象。试着用一个控制台来理解我的意思。
- @埃里克林本你说的"以东十一号"(14)是什么意思?
- 如果没有typeof,somevar==undefined仍然可以
从技术上讲,正确的解决方案是(我相信):
你有时会变得懒惰和有用
但这允许未定义的变量x和包含空值的变量x返回true。
- 如果你输入var x;,然后输入typeof x;,你会得到"undefined",就像你输入typeof lakjdflkdsjflsj;一样。
- 是的,变量仍然未定义。
- 所以没有办法检查未定义但已声明的变量?
- 我不这么认为,我不知道你为什么要这么做。
- ujndefined不应位于顶点之间
- 你说的顶点是什么意思?
我经常这样做:
1 2 3 4 5 6 7 8 9
| function doSomething(variable)
{
var undef;
if(variable === undef)
{
alert('Hey moron, define this bad boy.');
}
} |
- 考虑将"=="更改为"=="。如果调用dosomething(空),也将收到警报。除非那是你想要的。
- 是的。你必须决定你想要相等还是完全相等。任何一种情况都可能有用。
- 简单的检查如下->if(typeof variablename!=='未定义')警报(variablename);
- 这是无用的,因为您无论如何都不能将未定义的var传递给函数。
- 当然可以。尝试调用不带参数的函数。
更简单、更简略的版本是:
1 2 3
| if (!x) {
//Undefined
} |
或
1 2 3
| if (typeof x !=="undefined") {
//Do something since x is defined.
} |
- 如果从函数调用设置x,则第一个代码段可能不正确。就像x=a();如果a不返回任何内容,那么默认情况下它将返回"undefined"。做一个!x是真的,这在逻辑上是正确的。但是,如果a()返回0,则!x应该是假的,因为x=0。但是在JS中,!0也是如此。
- 第二个代码可以缩短为:if(!类型(xx))…{…}
- @亚历杭德罗席尔瓦很抱歉迟了答复。这不起作用,因为typeof返回一个字符串,所以它将为一个未定义的变量返回"undefined",而该变量的计算结果将为true,因此会导致一个已定义的变量出现误报。
- 请去掉第一个片段,这很糟糕
- 为什么不是X!=未定义的?
- 其他评论指出,第一个例子不好,但不清楚为什么。所以,对于任何新的编码员:!x不检验x是否被定义,但它是否真实。字符串、布尔真值和正数都是真实的(我可能忘记了一些事情),但其他可能有效的值(如0、布尔假值和空字符串)都不是真实的。第一个示例可以适用于特定的用例(例如,如果可以将空字符串视为未定义的字符串,则测试该字符串),但是由于存在许多不可能的情况,因此不应将其视为检查的默认方法。
- 我试着用if(!因为它看起来很简单…但它不起作用。在所有的现代浏览器中,javascript每次都会在那个时候停止执行。控制台显示一个错误,X未定义。投票率下降1。
另一个可能的"解决方案"是使用window对象。它避免了在浏览器中出现引用错误问题。
1 2 3 4 5
| if (window.x) {
alert('x exists and is truthy');
} else {
alert('x does not exist, or exists and is falsy');
} |
还可以使用三元条件运算符:
1 2
| var a ="hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a =" + a); |
1 2
| //var a ="hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a =" + a); |
- 如果var a = false;呢?你应该检查一下
- 如果a=false,则显示"我不知道a"。
- 问题:检查未定义的变量…..这是未定义的变量:执行上述操作将引发错误
- "如果a=false,那么它将显示"我不知道‘a’"——这就是问题所在,问题是测试它是否被定义,而不是它是否是真的。"如果a被定义为false,则a不是未定义的。在这种情况下,返回的结果是错误的。请参阅stackoverflow.com/a/858270/2055492上的我的评论,了解关于这种方法为什么不起作用的更多详细信息。
我经常用最简单的方法:
1 2 3 4 5 6
| var variable;
if (variable === undefined){
console.log('Variable is undefined');
} else {
console.log('Variable is defined');
} |
编辑:
在不初始化变量的情况下,将引发异常:"未捕获引用错误:未定义变量…"
- 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。
只需执行以下操作:
1 2 3
| function isNotDefined(value) {
return typeof value ==="undefined";
} |
就像这样称呼它:
1 2
| isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false |
我使用一个小函数来验证是否声明了一个变量,这确实减少了JavaScript文件中的混乱程度。我添加了一个值检查,以确保变量不仅存在,而且已经分配了一个值。第二个条件检查变量是否也被实例化,因为如果变量已经定义但没有被实例化(见下面的例子),如果您试图在代码中引用它的值,它仍然会抛出一个错误。
未实例化-var my_variable;实例化-var my_variable ="";。
1 2 3 4 5 6 7
| function varExists(el) {
if ( typeof el !=="undefined" && typeof el.val() !=="undefined" ) {
return true;
} else {
return false;
}
} |
然后,您可以使用条件语句来测试变量是否已这样定义和实例化…
1
| if ( varExists(variable_name) ) { // checks that it DOES exist } |
或者测试它是否还没有被定义和实例化…
1
| if( !varExists(variable_name) ) { // checks that it DOESN'T exist } |
- 为什么不立即返回谓词?return typeof el !=="undefined" && typeof el.val() !=="undefined"
对于传递给它的任何参数/表达式,void运算符返回undefined。因此,您可以根据结果进行测试(实际上,有些微程序将代码从undefined更改为void 0,以节省几个字符)
例如:
1 2 3 4 5 6
| void 0
// undefined
if (variable === void 0) {
// variable is undefined
} |
错误是告诉您,x甚至不存在!它尚未声明,这与分配值不同。
1 2
| var x; // declaration
x = 2; // assignment |
如果您声明为x,则不会得到错误。你会得到一个警告,说undefined,因为x存在/已声明,但尚未分配值。
要检查变量是否已声明,可以使用typeof,检查变量是否存在的任何其他方法都会引发与最初相同的错误。
1 2 3
| if(typeof x !== "undefined") {
alert(x);
} |
这是检查存储在x中的值的类型。只有当x尚未声明或已声明但尚未分配时,才会返回undefined。
接受的答案是正确的。只想再增加一个选项。您也可以使用try ... catch块来处理这种情况。一个奇怪的例子:
1 2 3 4 5 6 7 8 9 10
| 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块,它有点混乱,因为它创建了一个块级范围。当然,这个例子非常简化以回答问题,它不包括错误处理的最佳实践;)。
我们可以检查undefined如下
1 2 3 4 5 6 7
| var x;
if (x === undefined) {
alert("x is undefined");
} else {
alert("x is defined");
} |