问:
如何确定变量是 undefined 还是 null?
我的代码如下:
var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
// DO SOMETHING
};
但如果我这样做,JavaScript 解释器会停止执行。
答1:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
您可以使用 abstract equality operator 的特性来执行此操作:
if (variable == null){
// your code here.
}
因为 null == undefined 为真,所以上面的代码将同时捕获 null 和 undefined。
我正在尝试测试 Firefox 中的事件是否为空,并且错误会阻止执行:“事件未定义”
@MichaelFever 那怎么行不通?将此复制粘贴到您的控制台中:const y = undefined; y == null; 它应该返回 true
@ChrisStryczynski 在您的评论示例中,您声明 y 为常量,但您需要比较 abc(不是 y)。当我在 Chrome 和 Firefox 上通过 console.log(y == null); 测试 y 时,我得到了 true。如果您遇到错误,那么您可能尝试使用赋值运算符 = 而不是比较 ==,这将返回错误,因为无法重新分配 const。
可能很棘手:undefined !== null --> 真 undefined == null -->真的
live example 的相关比较。 lgtm
答2:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
同时捕获 null 和 undefined 的标准方法是:
if (variable == null) {
// do something
}
– 这 100% 等同于更明确但不太简洁的:
if (variable === undefined || variable === null) {
// do something
}
在写专业的 JS 时,理所当然地理解 type equality and the behavior of == vs ===。因此我们使用 == 并且只与 null 进行比较。
再次编辑
建议使用 typeof 的评论完全是错误的。 是的,如果变量不存在,我上面的解决方案将导致 ReferenceError。 这是一件好事。 这个 ReferenceError 是可取的:它会帮助您在发布代码之前发现错误并修复它们,就像其他语言中的编译器错误一样。如果您正在处理您无法控制的输入,请使用 try/catch。
您不应在代码中引用任何未声明的变量。
如果在代码中根本没有定义或引用变量,这将导致 ReferenceError 并中断执行,使用 typeof 更安全。
这更像是一个风格点。如果变量根本没有被声明,那真的只是作者写得不好。您应该知道您的变量是否已被声明,这不应该是一个问题。但是是的,如果由于某种原因是这种情况,则应将其更改为 window.variable 而不仅仅是变量,这不会导致引用错误。应避免使用 typeof。
是的,因为您写的是 !== 而不是 !=。
-OP:关于这些比较是“100% 等效”的声明是完全错误的,正如您在自己的编辑中指出的那样,第二个将导致 ReferenceError。至于断言:“您的代码中不应引用任何未声明的变量。”真的吗?听说过可选参数吗? jsfiddle.net/3xnbxfsu
@TimothyKanski 可选参数如果未提供可选参数,则可能未定义,但它们绝对是声明的变量。它们被声明并具有 undefined 的值,就像任何已声明但未初始化的变量一样,即 var someVar;,因此您的论点并没有真正成立
答3:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
结合以上答案,似乎最完整的答案是:
if( typeof variable === 'undefined' || variable === null ){
// Do stuff
}
这应该适用于任何未声明或已声明并显式设置为 null 或未定义的变量。对于具有实际非空值的任何已声明变量,布尔表达式的计算结果应为 false。
@Aerovistae 我认识到 typeof 是一个运算符,而不是一个函数,所以它不需要括号,但我仍然很欣赏括号 - 只是为了阅读清晰。
直接检查 if(variable===undefined) 而不是使用 typeof 怎么样?
@ArjunU 如果未声明变量,将导致 ReferenceError 。如果您不知道是否声明了变量,请使用上述解决方案。如果您可以保证至少声明了变量,则可以使用 variable == null
这是一个更好的解决方案,因为正如@Rogue 指出的那样,变量可能不会被声明。
如果我错了,请纠正我,但第一个条件不是第二个的超集,因此第二个条件是多余的吗?
答4:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
if (variable == null) {
// Do stuff, will only match null or undefined, this won't match false
}
万一有人认为这是另一个半答案,这确实有效。 undefined 等于 null。
在 chrome 控制台中对我失败... ReferenceError:变量未定义,因此它可能有效,但不适合我...
它仅适用于已声明的变量,而不适用于可能声明或未声明的变量,这种情况很少见。 (对于这种情况,您需要使用 typeof + null 检查)
只需 figured out,您就可以在 JS 文档或函数的顶部添加以下注释:/*jshint eqnull:true */,JSHint 将停止警告您使用 == null。
@Aerovistae 您能否指出一个明确指出 == 已损坏的参考资料。这个答案中的强制 if(variable == null) 对我来说完全有意义......
答5:
huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。
if (typeof EmpName != 'undefined' && EmpName) {
如果 value 不是,将评估为 true:
无效的
不明确的
钠
空字符串 (“”)
0
错误的
我认为这是一种危险的技术,已经像野火一样蔓延开来。因为许多检查的变量可能是布尔值或数字。所以如果用户不完全理解后果,这是没有好处的。
请提供此 javascript especification 的参考
这与 if (EmpName) 相同。如果它是 undefined 就已经是假的了。
如果变量未定义。那么 if(EmpName) 会抛出错误
@Thamaraiselvam 我认为鲁迪可能是这个意思var EmpName; if (EmpName)。变量已定义但未分配值的位置。
答6:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
可能最短的方法是:
if(EmpName == null) { /* DO SOMETHING */ };
这是证据:
函数检查(EmpName){如果(EmpName == null){返回真; };返回假; } var log = (t,a) => console.log(${t} -> ${check(a)}
);日志(‘空’,空);日志(‘未定义’,未定义);日志(‘NaN’,NaN);日志(‘””’, ””);日志(‘{}’, {});日志(‘[]’, []);日志(‘[1]’, [1]);日志(‘[0]’, [0]);日志(‘[[]]’, [[]]);日志(‘真’,真);日志(‘假’,假);日志(‘“真”’,“真”);日志(‘“假”’, “假”);日志(‘无穷大’,无穷大); log(‘-无穷大’, -无穷大);日志(‘1’,1);日志(‘0’,0);日志(‘-1’,-1);日志(‘“1”’, “1”);日志(‘“0”’, “0”);日志(‘“-1”’, “-1”); // “void 0” case console.log(‘—\n"true" is:’, true); console.log(‘“void 0” is:’, void 0);日志(无效 0,无效 0); // “void 0”是“未定义”
以下是有关 == 的更多详细信息(来源 here)
https://i.stack.imgur.com/nkpj6.png
奖励:=== 比 == 更清晰的原因(查看 agc answer)
https://i.stack.imgur.com/7MeG6.png
谢谢你,很好的答案!像 if(var) 或 if(!var) 这样的表达式呢?
@IceFire 示例差异:if(var)/if(!var) 将为值 true/false 执行代码。 var 的那些值的 if(var == null) 永远不会执行代码...
好吧,这很简单,但是上面的矩阵之一也可以用来检查 if 表达式为不同的值产生什么吗?
@IceFire 在我的回答中有指向此图片来源的链接-那里还有 if 语句“矩阵”
答7:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
jQuery attr() 函数返回一个空白字符串或实际值(从不返回 null 或 undefined)。它返回 undefined 的唯一时间是您的选择器没有返回任何元素。
因此,您可能希望针对空白字符串进行测试。或者,由于空白字符串、null 和 undefined 是 false-y,您可以这样做:
if (!EmpName) { //do something }
Chrome 17.0.963.78 m 给出了这个错误:ReferenceError: EmpName is not defined
@EranMedan 我知道这已经很晚了,但希望它会帮助以后来这里的人。您收到错误的原因是因为它根本没有被声明。通常你会将 EmpName(或其他一些变量)传递给一个函数,或者另一个函数的返回值并因此声明(例如:“var x;”)。要测试它是否返回 undefined、null 或空白字符串,您可以使用上述解决方案。
我意识到这是一个很冷的问题,但是如果元素上不存在该属性,jQuery 将返回 undefined (不仅仅是如果选择器没有匹配的元素,根据答案)。例如,没有 src 的 img 将为 $('img').attr('src'); 返回 undefined
答8:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
编辑的答案:在我看来,你不应该使用我下面的旧答案中的功能。相反,您可能应该知道变量的类型并直接使用根据检查(例如,想知道数组是否为空?只需执行 if(arr.length===0){} 等)。这个答案甚至没有回答 OP 的问题。
我来为此编写自己的函数。 JavaScript 很奇怪。
它几乎可以用于任何东西。 (请注意,这还会检查变量是否包含任何可用值。但由于通常还需要此信息,我认为值得发布)。请考虑留下便条。
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;
}
TypeScript 兼容。
这个函数应该完全做与 PHP 的 empty() function 相同的事情(参见 RETURN VALUES)
将 undefined、null、false、0、0.0、“0” {}、[] 视为空。
“0.0”、NaN、" "、true 被视为非空。
我遇到了一个小空值检查问题。我想检查传递的参数是否为空或空对象 { }。这是一个常见且愚蠢的语言问题,但我忘记了。我所有的搜索都显示了未定义空值或松散相等比较 ( == ) 的答案,但不显示严格相等 ( === ) 或等效的答案。然后在页面最底部的 -1 排名答案中(在我投票之前)是我无法理解的答案。 Object.keys( obj ).length < 1 或者可能 === 0,假设它永远不会是 -1。无论如何,投票给0,哇。 :p
谢谢,我已经能够删除这个函数并清理很多代码。为什么这不是标准的 JS 函数超出了我的理解。
您应该在此处将您的 == 的 all 更改为 ===,那么这将是一个合理的功能。
答9:
huntsbot.com – 高效赚钱,自由工作
最短和最简单的:
if(!EmpName ){
// DO SOMETHING
}
如果 EmpName 是,这将评估 true:
无效的
不明确的
钠
空的
细绳 (””)
0
错误的
这里的用例是我想知道 undefined 和 false 之间的区别。然后我将使用对 null 的检查。
答10:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
如果要检查的变量是全局变量,请执行
if (window.yourVarName) {
// Your code here
}
即使 yourVarName 变量不存在,这种检查方式也不会引发错误。
示例:我想知道我的浏览器是否支持 History API
if (window.history) {
history.back();
}
这是如何工作的:
window 是一个将所有全局变量作为其属性的对象,在 JavaScript 中,尝试访问不存在的对象属性是合法的。如果 history 不存在,则 window.history 返回 undefined。 undefined 是错误的,因此 if(undefined){} 块中的代码不会运行。
读者应该注意,这样的方法用于检查 - 从浏览器中运行的 JavaScript - 是否已声明 global 变量,尤其是浏览器提供的全局(如历史 API)是否已声明可用的。它将不起作用来检查非全局变量是 null 还是 undefined,如果您的 JavaScript 在浏览器之外运行(即在 Node.js 中),它也不起作用。它还会将设置为 0、false 或 '' 的全局变量与未声明或 undefined 或 null 的全局变量相同,这通常很好。
这假定脚本在浏览器中运行。这不是给定的。
答11:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
在 JavaScript 中,据我所知,我们可以检查一个未定义的、空的或空的变量,如下所示。
if (variable === undefined){
}
if (variable === null){
}
if (variable === ''){
}
检查所有条件:
if(variable === undefined || variable === null || variable === ''){
}
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
var 是保留字,这将抛出 SyntaxError
@dhilt 从 var 到 variable 实现
与HuntsBot一起,探索全球自由职业机会–huntsbot.com