如何确定变量是undefined还是null?我的代码如下:
1 2 3 4
| var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
//DO SOMETHING
}; |
但如果我这样做,javascript解释器将停止执行。
- 我们能指定这个问题被锁定吗?我没有足够的代表@tats_innit
- @Aerovistae只有钻石版主可以手动锁定和解锁stackoverflow post:meta.stackexchange.com/questions/22228/…:)。
- 在javascript中如何检查空字符串的可能副本?
可以使用抽象相等运算符的特性来执行此操作:
1 2 3
| if (variable == null){
// your code here.
} |
由于null == undefined为真,上述代码将同时捕获null和undefined。
- 我正在测试火狐中的事件是否为空,错误是否阻止执行:"事件未定义"
- 你能分享一下出错的代码吗?使用Pastebin链接。
- 这不管用!!它是怎么得到2418票的?
- @迈克尔夫,这怎么不管用?复制粘贴这个在你的控制台:const y = undefined; y == null;它应该返回true。
- const y = undefined; abc == null;将返回一个错误…似乎undefined被定义为…
- @在示例中,Chrisstryczynski,从您的评论中,您声明了y常量,但您比较了abc常量(而不是y)。当我在Chrome和火狐上通过console.log(y == null);测试y时,我得到了true。如果出现错误,那么您可能试图使用赋值运算符=,而不是比较==,因为const无法重新赋值,所以返回错误是有意义的。
同时捕获null和undefined的标准方法是:
1 2 3
| if (variable == null) {
// do something
} |
--这100%相当于更明确但不简洁的:
1 2 3
| if (variable === undefined || variable === null) {
// do something
} |
在编写专业的JS时,人们理所当然地理解类型平等和==与===的行为。因此,我们使用==,仅与null进行比较。
再次编辑
建议使用typeof的评论是完全错误的。是的,如果变量不存在,上面的解决方案将导致引用错误。这是件好事。这个引用错误是可取的:它将帮助您在发送代码之前找到错误并修复它们,就像其他语言中的编译器错误一样。
在代码中不应该有对未声明变量的任何引用。
- 这将导致在referenceerror is not布尔变量定义打破执行if at all or to the队列中的所有typeof is,使用更安全。
- 这是stylistic more of a点。if the变量t at all been declared不坏,这真的只是写作on the part of the author。你应该知道你declared has been whether or not变量T,那不好的问题。for some reason but if yes,这茶馆,this should be changed to window.variable instead of which will not just变量,参考误差的原因。avoided typeof should be。
- 你朋友多的使用案例。你从什么地方得到的关于日期的URL查询参数或其他such as JSON数据从一些API吗?它的动态结构是什么?You should be to data['token']is if测试可以定义吗?顺便,你为什么会对上述定义的角角框架but some angular.isDefined函数if it was useless?你的答案是一位超级pragmatism缺乏严格和学院。
- 你不需要data['token']typeofto check that can be done by - if (data.token != null) { /* use data.token */ }。这是不一样的。You are right about,不管一个人多,具角。他们有一些非常专业的方法在那里,hasCustomToStringisBlankObject和类。他们想evidently翻唱都变为undefinedwhere the茶馆nullAS AS /阱undeclared references。当你正确的about their most people for this is队列,they are looking for not是什么,我assertion和待机模式,如果你认为你需要它,你可能错了。
- 在我去if (variable !== null)Undefined即使它……
- 因为你是wrote !==instead of !=。
- 我想象的_ check if Load模块_ = 1 1 1 _ but the Load模块_ can be Undefined因为depends Ajax在线加载。我怎么能在check for its value does not = 1和get the Undefined误差?在单打在线of if(!返回x){;}
- 米盖尔:@"possibly declared typically,这样的变量是全局变量,即"面向windowproperties of the solution is,and the to them to参考标准if (! window.load_module_1) return;explicitly as such,例如。
- 一个在使用房屋的合法entirely微软动态CRM where is,is of the custom触发执行scripts一前端(IU)和变量(或passed configuration are not that is from a passed)定义了字符串输入框安在前端。
- OP:the statement about那些比较"简单"的等价是100%错误",你在你自己的编辑noted as,the second referenceerror会的原因。As for the assertion:"You should not have any to undeclared references变量在你的尾巴。"真的吗?我听说of optional参数?jsfiddle.net / 3xnbxfsu
- timothykanski optional parameters"may be if they are not提供optionally Undefined,but they are most当然declared元。他们是有价值的declared和declared but as any of undefined未初始化的变量,你会知道,你真的不var someVar;argument的老卡车
- chilinut给UPS在线arguing @的人谁与我在这的评论。一年前我在问到对MODS to开始清理。there have been many people知道this is wrong试图说服我。它永远不会结束。
- @Aerovistae word,lol,一种像js这样的语言,有8个不同编码级别和背景的人试图对其进行编程,我怀疑是否会结束支持错误实践的评论,或者完全错误地理解未声明变量这样的概念,这会在其他流行的静态类型语言bu中引发编译器错误。在像JS这样的动态语言中,T能够被"平滑化"。
- 也就是说,对于诸如javascript和php这样的入门成本较低的语言来说,这是一件很常见的事情,而在真正用它编程之前,比如haskell或scala,你需要对语言的工作方式有更复杂的理解。
- 您会说"您不应该在代码中有任何对未声明变量的引用",但是您忘记了您需要解析服务调用,这些调用可能声明属性,也可能不声明属性。有人需要知道是否接收到someRemoteObjectReceived.randomproperty,根据一系列不可控制的事件,根本没有接收到空、未定义、真、真、假、假、1或0。
- 并确定不需要typeof。这里的答案可以区分undefined和"根本没有收到",这在typeof中肯定是不可能的。为了区分您列出的其他8个项目,只有===可以完成这项工作。我甚至无法想象你是如何得出这样的结论的:typeof将区分0和1,或是真和假,但===不会。
- @我可以把它当作-如果(变量!{NULL){}?它会产生预期的结果吗?
- 在变量既不是null也不是undefined的所有情况下,该条件的值都将为true,因此如果这是您想要的,那么是的,它将给出所需的结果。你可以很容易地测试出来。
- 难道你不能用javascript来做if (variable) 吗?另外,人们可能指的是instanceof而不是typeof,尼古拉斯·扎卡斯认为这是一个最佳实践。
- @托马斯·埃多克斯(Thomas EDOCX1)(11)测试了真实性。它会把false、0、NaN和一个空字符串以及null和undefined计算在内,所以这里的回答不正确。至于instanceof,如果问题是"这个变量是空的还是未定义的?"(也许您希望值是null或undefined…)您不能通过instanceof来确定,除非检查该值不是任何其他类型的实例,这是疯狂的。所以这也是错误的答案。
- 最好把不定义放在一个Qoutes中,"未定义",因为它会使它更容易理解。
- ……这是什么意思?
- 操作员类型错误的原因是什么?
- 上面的评论解释了这一点。
结合以上答案,最完整的答案应该是:
1 2 3
| if( typeof variable === 'undefined' || variable === null ){
// Do stuff
} |
对于未声明或声明并显式设置为空或未定义的任何变量,这都应该有效。对于任何声明的具有实际非空值的变量,布尔表达式的值应为false。
- @Aerovistae我认识到typeof是一个运算符,而不是一个函数,因此它不需要括号,但我还是很欣赏括号——只是为了阅读清楚。
- 直接检查(variable==undefined)而不是使用typeof怎么样?
- @如果未声明变量,将导致引用错误的arjunu。如果不知道是否声明变量,请使用上述解决方案。如果你能保证变量至少被声明,你可以使用variable == null。
- 这是一个更好的解决方案,因为正如@rogue指出的那样,变量可能不会被声明。
- 如果我错了,请纠正我,但是第一个条件不是第二个条件的超集,因此第二个条件是多余的吗?
- "不marchho can be the first。虚假的条件和第二条件,can be true。当考虑的变量定义和茶馆nullhas the value is。
1 2 3
| if (variable == null) {
// Do stuff, will only match null or undefined, this won't match false
} |
- 为了防止有人认为这是另一个半答案,这确实有效。undefined的计算结果等于null。
- 在Chrome控制台中失败…referenceerror:变量未定义,因此可能有效,但不适用于我…
- 它只适用于声明的变量,而不适用于可能声明或可能不声明的变量,这种情况很少发生。(您需要使用typeof+空检查该情况)
- 出于某种原因,jshint不喜欢这样。:(
- 您可以在JS文档或函数的顶部添加这个注释:/*jshint eqnull:true */,jshint将停止警告您使用== null。
- 正如用户216441所指出的,这对于未声明的变量jsfiddle.net/u2vhs/3是一个nogo。
- 我们要强调的是,这个答案利用了==的破坏性,因此是不明智的……最好指定if (variable === null || variable === undefined),这样读代码的人就可以确切地知道它的目的和时间。
- @你能给我指一个明确说明==坏的参考资料吗?我完全理解这个答案中的强制要求。
- 代码对您有意义的事实并不能使它成为合理的代码。
- 这个答案是错误的。未定义的变量产生ReferenceError。
- 答案不适用于未定义的变量lol
1
| if (typeof EmpName != 'undefined' && EmpName) { |
如果值不是:
- 我认为这是一种危险的技术,已经像野火一样蔓延开来。因为很多被检查的变量可以是布尔值或数字。因此,如果用户不完全理解结果,这是没有好处的。
- 请提供此javascript规范的参考
- 这与if (EmpName)相同。如果是undefined的话,就已经不可靠了。
- 如果变量未定义。那么如果(empname)将引发错误
- @我认为鲁迪可能指的是这个埃多克斯。定义变量但未赋值的。
- @Thamaraiselvan正如Aerovistae在"再次编辑"下写的那样,你不应该使用未定义的变量,在这种情况下抛出一个错误是很好的,因为你会很快注意到这个错误并修复它。
- @如果代码中根本没有定义或引用变量,使用typeof可以更安全地引用错误和中断执行。如果它的SaaS没有问题,如果它类似于自托管应用程序。修复一个错误是一团糟的。
- @我觉得你误解了我写的东西。我同意,如果不声明变量,省略typeof检查将导致引用错误。typeof检查只意味着表达式将简单地计算为false,而不是编译时错误。这不是OP应该想要的-他应该修复未声明的变量。因此,与开发人员立即发现的错误不同,您将得到一个潜在的更微妙的错误,它可能需要一些时间进行调试,并且可能在未被注意的情况下进入生产。所以在这种情况下,最好让它抛出异常。
- 我相信没有引号的if(variable==undefined)最适合在将任何未定义的对象或原语发送到可能与之崩溃的其他指令之前捕获它。
jquery attr()函数返回空字符串或实际值(从不返回null或undefined)。它返回undefined的唯一时间是选择器没有返回任何元素。
因此,您可能需要对空字符串进行测试。或者,由于空字符串、空字符串和未定义字符串都是false-y,您可以这样做:
1
| if (!EmpName) { //do something } |
- chrome 17.0.963.78 m给出了这个错误:ReferenceError: EmpName is not defined。
- @埃兰梅丹,我知道这很晚了,但希望对以后来这里的人有所帮助。您得到错误的原因是它根本没有被声明。通常将empname(或其他某个变量)传递给一个函数,或者传递给另一个函数的返回值,并因此声明(例如:"var x;")。要测试它是否返回未定义、空或空字符串,可以使用上面的解决方案。
- 我知道这是一个冷问题,但是如果元素上不存在属性,jquery将返回undefined(不仅仅是如果选择器没有匹配的元素,根据答案)。例如,没有src的img将返回undefined作为$('img').attr('src');的undefined。
如果要检查的变量是全局变量,请执行以下操作:
1 2 3
| if (window.yourVarName) {
// Your code here
} |
这种检查方法即使不存在yourVarName变量也不会抛出错误。
示例:我想知道我的浏览器是否支持历史API
1 2 3
| if (window.history) {
history.back();
} |
如何运作:
window是一个将所有全局变量作为其属性的对象,在javascript中,试图访问一个不存在的对象属性是合法的。如果history不存在,那么window.history返回undefined。undefined是假的,所以if(undefined){}块中的代码不会运行。
- 读者应该注意,这样的方法是用于检查(从浏览器中运行的javascript)是否声明了全局变量,尤其是浏览器提供的全局变量(如历史API)是否可用的惯用方法。它不适用于检查非全局变量是null还是undefined,也不适用于在浏览器外运行的javascript(即在node.js中)。它还将处理设置为0、false或''的全局,与未申报或undefined或null的全局相同,这通常很好。
- 这假定脚本在浏览器中运行。那不是一个给定的。
我是来为这个写我自己的函数的。javascript很奇怪
可用于任何东西。(注意,这也会检查变量是否包含任何可用值。但由于这些信息通常也是需要的,我认为这是值得发布的)。请考虑留个便条。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| function empty(v) {
let type = typeof v;
if (type === 'undefined') {
return true;
}
if (type === 'boolean') {
return !v;
}
if (v === null) {
return true;
}
if (v === undefined) {
return true;
}
if (v instanceof Array) {
if (v.length < 1) {
return true;
}
} else if (type === 'string') {
if (v.length < 1) {
return true;
}
if (v === '0') {
return true;
}
} else if (type === 'object') {
if (Object.keys(v).length < 1) {
return true;
}
} else if (type === 'number') {
if (v === 0) {
return true;
}
}
return false;
} |
打字稿兼容。
编辑。这个函数应该做与phps empty()函数完全相同的事情(见RETURN VALUES)
认为undefined、null、false、0、0.0、"0"、{}、[]为空。
"0.0"、NaN、""、true被认为是非空的。
- 我遇到了一个小的空检查问题。我想检查正在传递的参数是空的,还是空的对象{ }。这是一个常见而愚蠢的语言问题,但我已经忘记了。我的所有搜索都显示未定义的空值、松散的相等比较(==)的答案,但不显示严格相等(==)或等效项。然后在你的-1排名答案的最底部(在我投反对票之前)是我无法得到的答案。Object.keys( obj ).length < 1或可能==0,假设永远不会是-1。不管怎样,向上投0,呜。P
- 谢谢,我已经可以把这个函数放到并清理了很多代码。为什么这不是标准的JS函数超出了我的能力。
- 你应该把所有的==都改成===,这是一个合理的功能。
因为您使用的是jquery,所以可以通过使用单个函数来确定变量是未定义的还是其值为空。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var s; // undefined
jQuery.isEmptyObject(s); // will return true;
s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;
// usage
if(jQuery.isEmptyObject(s)){
alert('Either variable: s is undefined or its value is null');
}else{
alert('variable: s has value ' + s);
}
s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false; |
- 这对我不起作用。我仍然得到了错误:第一个例子是ReferenceError: s is not defined。
- 这不适用于number。
- 不工作检测jquery是错误prntscr.com/h7pq4b
我刚遇到这个问题,即检查对象是否为空。我只是用这个:
即
1 2
| if (document.getElementById("enterJob"))
document.getElementById("enterJob").className += ' current'; |
- 它会好的document.getelementbyid var =更好的集("enterjob")if(a)是a.classname + =电流*;50%为你工作"的结果……但也许你只是我的健康和我恩for shows。
- "安东尼。它的作品,我不ambiguity there。):
jquery check元素不为空
1 2 3 4 5 6 7 8
| var dvElement = $('#dvElement');
if (dvElement.length > 0) {
//do something
}
else{
//else do something else
} |
解决方案如下:
1 2 3 4 5 6 7 8
| const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);
console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1,"1")); // false
etc... |
我可以检查以下内容:
- 这并不能回答问题,即"如何捕获空值和未定义值?"不是"我如何捕捉javascript中的每个错误值?"
- @我想我是用console.log(isdeepequal(null,null));和console.log(isdeepequal(undefined,undefined));?
我在chrome控制台上运行这个测试,使用(void 0)可以检查未定义的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var c;
undefined
if(c === void 0)alert();
// output = undefined
var c = 1;
// output = undefined
if(c === void 0)alert();
// output = undefined
// check c value c
// output = 1
if(c === void 0)alert();
// output = undefined
c = undefined;
// output = undefined
if(c === void 0)alert();
// output = undefined |
最佳方式:
1 2 3 4
| if(typeof variable==='undefined' || variable===null) {
/* do your stuff */
} |
- 这一确切的解决方案已于2013年10月11日由@jkindwall提供。stackoverflow.com/a/19323555/2943403此代码仅发布是完全无用的,因为它没有为页面添加新值。事实上,它增加了页面膨胀,浪费了研究人员阅读它的时间。请删除此答案。
1 2 3 4 5 6 7
| var i;
if(i === null || typeof i === 'undefined'){
console.log(i,'i is undefined or null')
}else{
console.log(i,'i has some value')
} |
- 如果用户输入"未定义"这个词会发生什么?
- 你的问题很好,它表明条件是真的,所以我们需要把选项normal undefined改为typeof条件。卡盘
- 这是错误的。typeof永远不会产生undefined,只有字符串'undefined'。此外,如果i是undefined,那么i == null已经是正确的,因此第二个布尔值即使有效也会是多余的。
- 此解决方案(条件相反)已于2013年10月11日由@jkindwall提供。stackoverflow.com/a/19323555/2943403此代码仅发布是完全无用的,因为它没有为页面添加新值。事实上,它增加了页面膨胀,浪费了研究人员阅读它的时间。请删除此答案。
您可以使用typeof检查值是否未定义或为空:
1
| if(typeof value == 'undefined'){ |
- 请参阅上一个答案(stackoverflow.com/a/21273362/6305294)中有关类型的注释。
- 这是不正确的。不抓到null。我不明白为什么许多年前给出了正确和完整答案的问题会有新的、不正确的答案。你是否觉得目前的答案不够充分?
1 2 3
| (null == undefined) // true
(null === undefined) // false |
因为==同时检查类型和值。两者的类型不同,但值相同。
我看到原来的帖子使用的是jquery。所以我要通过jquery添加我过去使用过的内容。通常,当我执行这样的检查时,我不必为了这个目的检查值是否为空或未定义。更像是"这里的值是这样我就可以对它执行操作。"为此,我使用以下内容。我没有尝试过每种类型,但我知道它适用于空值和未定义值。另外,对象和数组(这些对象和数组的空版本将返回true)。当然,如果变量不存在,您会得到一个异常,但是我真诚地尽力避免这种情况。所以我同意航空摄影。我想在我的代码中知道这一点,不想跳过它。
1 2 3
| if ($.trim(value) != '') {
//Do Something
} |
调用typeof NULL返回"object"的值,因为特殊值NULL被视为空对象引用。Safari到第5版和Chrome到第7版都有一个怪癖,在这个怪癖中,对正则表达式调用typeof返回"function",而所有其他浏览器都返回"object"。
这是一个非常古老的问题,但我仍然认为测试这两个条件的最佳/安全方法是将值强制转换为字符串:
1 2 3 4 5 6 7 8 9 10 11
| var EmpName = $("div#esd-names div#name").attr('class');
// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
// do something with your code
}
// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
// do something with your code
} |
- 你能解释一下为什么你认为这是执行测试的"最佳/安全方法"吗?
- 因为转换总是返回一个"标准化"字符串(即[对象未定义]),所以您不会因为测试错误的值而陷入麻烦。这正是我根据我对真实/虚伪价值观的经验得出的观点。
- 谢谢你的解释。我不是批评,这是一个有趣的答案,我只是想让你为其他人解释一下为什么这可能优于其他方法。
- 别担心!我对这种比较有很多问题,直到现在,我发现它是解决这一问题最有用的方法。
1 2 3 4 5 6 7
| var x;
if (x === undefined) {
alert ("only declared, but not defined.")
};
if (typeof y ==="undefined") {
alert ("not even declared.")
}; |
您只能使用第二个:因为它将检查定义和声明
为了测试变量是否为空或未定义,我使用下面的代码。
1 2 3
| if(sVal === '' || sVal === null ||typeof sVal === 'undefined'){
console.log('variable is undefined or null');
} |
- 关闭但不关闭。直接丢失typeof,并与undefined进行比较,而不是作为字符串。这是可行的,但额外的运算符没有效果,只能使其更复杂。
- 在这种情况下,是的,你是对的,我们不需要使用typeof。但是在处理未定义的变量时使用typeof是一个很好的实践。使用typeof的一个原因是,如果未声明变量,它不会引发错误。
- 这实际上是件坏事。您不希望在代码中使用未声明的变量。您希望它抛出一个引用错误,这样就可以找到变量并声明它。当然,你不会用C++这样的编译语言来尝试!仅仅因为JS允许,并不意味着应该这样做。
- 你的OR语句是向后的。检查是否有未定义的内容是第一步,而不是第二步。
if(x==null)在javascript中是个坏主意,用"=="判断可能会导致意外的类型强制,不能被咖啡脚本读取。切勿使用"="或"!="状态判断!
if(x)会更好,但如果是0和",则会被视为错误,与"!= null"不相等的方法是正确的。
https://www.w3schools.com/js/js_best_practices.asp网站
- 这是完全错误的,对任何专业级框架或软件的粗略研究都会在瞬间证实这一点。在JS中,使用==与null比较是抓取null和undefined的标准方法。在这种特定的情况下,使用==进行类型强制不是一种风险,事实上,它是为了实现同时捕获null和undefined的目标。请在选择对多年前圆满解决的问题提供错误和误导性的答案之前花更多的时间使用该语言。
- 避免"="。每件事都在不断变化,我不喜欢你@Aerovistae
- 你不同意我的观点——你不同意整个JavaScript的建立。让我们说清楚。