if (typeof v === "undefined") {
// no variable "v" is defined in the current scope
// *or* some variable v exists and has been assigned the value undefined
} else {
// some variable (global or local) "v" is defined in the current scope
// *and* it contains a value other than undefined
}
"use strict";
// var someVar;
var declared;
try {
someVar;
declared = true;
} catch(e) {
declared = false;
}
if (declared) {
console.log("someVar is declared; now has the value: " + someVar);
} else {
console.log("someVar is not declared");
}
5
Null是JavaScript中的值, typeof null 返回 "object"
因此,如果传递空值,则接受的答案将不起作用 . 如果传递空值,则需要为空值添加额外检查:
if ((typeof variable !== "undefined") && (variable !== null))
{
// the variable is defined and not null
}
2
如果你想要定义的块做某事,那么使用它
if (typeof variable !== 'undefined') {
// the variable is defined
}
如果您希望未定义的块执行某些操作或分配或定义变量,请使用此选项
if (typeof variable === 'undefined') {
// the variable is undefined
}
114
为了促成辩论,如果我知道变量应该是一个字符串或一个对象我总是更喜欢 if (!variable) ,所以检查它是否是假的 . 这可以带来更干净的代码,例如:
if (typeof data !== "undefined" && typeof data.url === "undefined") {
var message = 'Error receiving response';
if (typeof data.error !== "undefined") {
message = data.error;
} else if (typeof data.message !== "undefined") {
message = data.message;
}
alert(message);
}
..可以简化为:
if (data && !data.url) {
var message = data.error || data.message || 'Error receiving response';
alert(message)
}
27
Be Aware that when you check !== or != against "undefined" it wont work
Tested on Firfox Quantom 60.0.1
使用这样的测试来避免冲突
if(!(typeof varibl['fl'] === 'undefined')) {
console.log(varibl['fl']);
console.log("Variable is Defined");
}else{
console.log(varibl['fl']);
console.log("Variable is Un-Defined");
}
28 回答
这取决于实际情况 . 如果您正在检查可能在代码之外全局定义的内容(可能是jQuery),您需要:
(在那里不需要严格的相等,typeof总是返回一个字符串 . )但是如果你有一个函数的参数可能已经或者没有被传递,它们将始终被定义,但是如果被省略则为null .
很难区分undefined和null . Null 是当您想要指示变量没有特定值时可以分配给变量的值 . Undefined 是一个特殊值,它将是未分配变量的默认值 .
这些答案(除了Fred Gandt解决方案)都不正确或不完整 .
假设我需要
variableName;
携带undefined
值,因此它已经以var variableName;
的方式声明,这意味着它已经 initialized ; - 如何检查是否已经申报?或者甚至更好 - 如何通过一次调用立即检查“Book1.chapter22.paragraph37”是否存在,但不会引发参考错误?
我们通过使用最强大的JasvaScript运算符 in 运算符来实现:
在AJAX达到普及的时候,我编写了一个方法(后来命名)isNS(),它能够确定命名空间是否存在,包括对属性名称的深度测试,如“Book1.chapter22.paragraph37”等等 .
但由于它之前已经发布,因为它非常重要,它值得在一个单独的线程中发布,我不会在这里发布,但会提供关键字( javascript + isNS ),它将帮助您找到源代码,并提供所有必要的解释 .
你想the typeof operator . 特别:
typeof
运算符将检查变量是否确实未定义 .与其他运算符不同,
typeof
运算符在与未声明的变量一起使用时不会抛出ReferenceError异常 .但请注意
typeof null
将返回"object"
. 我们必须小心避免将变量初始化为null
的错误 . 为了安全起见,这是我们可以使用的:有关使用严格比较
===
而不是简单相等==
的更多信息,请参阅:Which equals operator (== vs ===) should be used in JavaScript comparisons?
最强大的'is it defined'检查是 typeof
如果您只是检查已定义的变量以指定默认值,那么通常可以执行以下操作:
它通常很好用,请参阅:Idiomatic way to set default value in javascript
还有一个使用 typeof 关键字的班轮:
更实用,更易于使用:
如果存在,该函数将返回 true ,如果不存在,则返回 false .
在问题中概述的特定情况下,
是完全相同的
我更喜欢后者,因为它更短 .
请注意,我们只在全局范围内查找
console
(在所有浏览器中都是window
对象) . 在这种特殊情况下,它想要console
在别处定义console
.@BrianKelley在他的回答中解释了技术细节 . 我只是添加了缺乏结论并将其消化为易于阅读的内容 .
在大多数情况下,您将使用:
与简单的
if (elem)
不同,它允许0
,false
,NaN
和''
,但拒绝null
或undefined
,使其成为参数或对象属性存在的良好通用测试 .其他检查也不正确,它们只是有不同的用途:
if (elem)
:如果保证elem
是一个对象,或者false
,0
等被认为是"default"值(因此相当于undefined
或null
),则可以使用 .typeof elem == 'undefined'
可用于指定的null
与未初始化的变量或属性具有不同含义的情况 .如果
elem
不是 declared (即没有var
语句,不是window
的属性,或者不是函数参数),这是 won't throw an error 的唯一检查 . 在我看来,这是相当危险的,因为它允许错别字被忽视 . 要避免这种情况,请参阅以下方法 .对
undefined
进行严格比较也很有用:但是,因为全局
undefined
可以用另一个值重写,所以最好在使用它之前在当前作用域中声明变量undefined
:要么:
这种方法的第二个优点是JS minifiers可以将
undefined
变量减少为单个字符,每次节省几个字节 .这取决于你是否只关心变量已定义或如果您希望它具有有意义的值 .
检查类型是否未定义将检查变量是否已定义 .
=== null
或!== null
仅检查变量的值是否正好null
.== null
或!= null
将检查值是undefined
还是null
.if(value)
将检查变量是undefined
,null
,0
还是空字符串 .怎么样简单:
检查对象是否hasOwnProperty()
过多的
typeof
答案的替代方案是使用hasOwnProperty()
当然检查一个对象(JS中的几乎所有东西)是否具有属性,即变量(以及其他内容) .hasOwnProperty()
的优点在于,在调用它时,我们不使用可能尚未定义的变量 - 这当然是问题的一半 .虽然不是完美或理想的解决方案,但在某些情况下,这只是工作!
当您执行简单的任务和相关检查时,还有另一种简短的方法可以检查这一点 . 只需使用 Conditional (Ternary) Operator.
当您尝试使用引用变量的实例赋值声明Global变量时,这也会有所帮助 .
如果你想检查变量不应该是
undefined
或null
. 然后执行以下检查 .When the variable is declared, and if you want to check the value, this is even Simple: 它会一起执行
undefined
和null
检查 .在JavaScript中,可以定义变量,但保持值
undefined
,因此最常见的答案在技术上不正确,而是执行以下操作:这可能足以满足您的目的 . 以下测试具有更简单的语义,这使得更容易精确描述代码的行为并自己理解(如果您关心这些事情):
当然,这假设您在浏览器中运行(其中
window
是全局对象的名称) . 但如果你're mucking around with globals like this you'可能在浏览器中 . 主观上,使用'name' in window
在风格上与使用window.name
引用全局变量一致 . 访问全局变量作为window
的属性而不是变量允许您最小化您在代码中引用的未声明变量的数量(为了利用linting),并避免全局被局部变量遮蔽的可能性 . 此外,如果全球性使你的皮肤爬行,你可能会感觉更舒服只用这个相对长的棍子接触它们 .如何检查变量是否存在
这是一个非常灵活的解决方案,用于测试变量是否存在并已初始化:
它最常与ternary operator结合使用,以便在某个变量尚未初始化时设置默认值:
封装问题
不幸的是,你不能简单地将你的支票封装在一个函数中 .
您可能会想到这样的事情:
但是,如果您正在调用eg,则会产生引用错误 .
isset(foo)
和变量foo
尚未定义,因为您无法将不存在的变量传递给函数:测试函数参数是否未定义
虽然我们的
isset
函数不能用于测试变量是否存在(出于上述原因),但它确实允许我们测试函数的参数是否未定义:即使
y
没有传递给函数test
,我们的isset
函数在此上下文中也能正常工作,因为y
在函数test
中被称为undefined
值 .或更好
适用于所有浏览器
要检查变量是否已声明/设置,我做了这个肮脏的技巧 .
我还没有找到将代码提取到函数的方法,即使使用
eval
.Null是JavaScript中的值,
typeof null
返回"object"
因此,如果传递空值,则接受的答案将不起作用 . 如果传递空值,则需要为空值添加额外检查:
如果你想要定义的块做某事,那么使用它
如果您希望未定义的块执行某些操作或分配或定义变量,请使用此选项
为了促成辩论,如果我知道变量应该是一个字符串或一个对象我总是更喜欢
if (!variable)
,所以检查它是否是假的 . 这可以带来更干净的代码,例如:..可以简化为:
Be Aware that when you check !== or != against "undefined" it wont work
Tested on Firfox Quantom 60.0.1
使用这样的测试来避免冲突
最高的答案是正确的,使用typeof .
但是,我想要指出的是,在JavaScript中
undefined
是可变的(出于一些不道德的原因) . 所以简单地检查varName !== undefined
有可能不会像你期望的那样总是返回,因为其他的库可能已经改变了未定义 . 一些答案(@ skalee的,一个),似乎不喜欢不使用typeof
,这可能会让人陷入困境 ."old"处理此问题的方法是声明未定义为var以抵消
undefined
的任何潜在静音/覆盖 . 但是,最好的方法仍然是使用typeof
,因为它将忽略来自其他代码的任何覆盖undefined
. 特别是如果您正在编写代码以便在野外使用,谁知道页面上还有什么可以运行...未定义,布尔,字符串,数字功能
对象,数组
我的偏好是
typeof(elem) != 'undefined' && elem != null
.无论如何选择,考虑将支票放入这样的功能中
如果您不知道变量已声明,则继续
typeof (x) != 'undefined' && x != null;
如果您知道变量已声明但可能不存在,则可以使用
您正在检查的变量有时可能是嵌套属性 . 你可以使用prop || {}下线检查有问题的 property :
在每个属性使用(...'|| {}') . nextProp之后,丢失的属性不会抛出错误 .
或者你可以使用像
existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)
这样的存在在许多情况下,使用:
会为你做这个工作!...这将检查以下案例:
undefined :如果未定义该值,则为
undefined
null :如果它为null,例如,如果DOM元素不存在...
empty string :
''
0 :数字为零
NaN :不是数字
false
因此它将涵盖所有情况,但总有一些奇怪的情况,我们也想覆盖,例如,一个带空格的字符串,如
' '
one,这将在javascript中定义,因为它里面有空格string ...例如,在这种情况下,您使用trim()添加一个检查,如:此外,这些检查仅适用于 values ,因为对象和数组在Javascript中的工作方式不同,空数组
[]
和空对象{}
始终为 true .我创建了下面的图像,以显示答案的简要说明:
我在上面的答案中看不到这一点,所以我想在这里建议一下 .
!如果x是 null 或 undefined ,x将返回true,所以!!如果x既不是未定义也不是null,则x将仅返回true .
我意识到这也是空案的原因,但这里有公平的警告 .
我根据对象使用两种不同的方式 .
有时我不想将空字符串评估为falsey,因此我使用这种情况
如果您需要相反的,那么在第一个实例中!变量变为!!变量,并且在无效函数中===变为!=并且函数名称变为notInvalid .
你可以使用
typeof
运算符 .例如,
上面的代码片段会返回输出