问:
是否有一个通用的 JavaScript 函数来检查变量是否具有值并确保它不是 undefined 或 null?我有这段代码,但我不确定它是否涵盖所有情况:
function isEmpty(val){
return (val === undefined || val == null || val.length <= 0) ? true : false;
}
答1:
huntsbot.com – 高效赚钱,自由工作
您可以检查 变量 是否具有 truthy 值。这意味着
if( value ) {
}
如果 value 不是,将评估为 true:
无效的
不明确的
钠
空字符串 (“”)
0
错误的
上面的列表代表了 ECMA-/Javascript 中所有可能的 falsy 值。在 ToBoolean 部分的 specification 中找到它。
此外,如果您不知道变量是否存在(也就是说,如果它被声明),您应该检查 typeof 运算符。例如
if( typeof foo !== 'undefined' ) {
// foo could get resolved and it's defined
}
如果您可以确定至少声明了一个 变量,则应直接检查它是否具有如上所示的 truthy 值。
如果该值是预期的错误布尔值怎么办。有时你想在没有值的情况下给出一个默认值,如果传入 false boolean,这将不起作用。
@TruMan1:在这种情况下(你的逻辑决定了验证)你必须像 if( value || value === false ) 一样。所有虚假值也是如此,我们需要明确地验证这些值。
除非 value 是一个数组。 truthy 的解释可能具有误导性。在这种情况下,我们应该检查 value.length != 0 是否有一个非空数组。
只是想补充一点,如果您觉得 if 结构在语法上过于繁重,您可以使用三元运算符,例如:var result = undefined ? "truthy" : "falsy"。或者,如果您只想强制转换为布尔值,请使用 !! 运算符,例如 !!1 // true、!!null // false。
另请注意,这不会检查仅包含空格字符的字符串。
答2:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
检查值是否未定义或为空的详细方法是:
return value === undefined || value === null;
您也可以使用 == 运算符,但这需要一个 know all the rules:
return value == null; // also returns true if value is undefined
可以像这样只检查 null 或 undefined:if (value == null)。注意强制的 == 运算符。如果您像 if (value === null || value === undefined) 一样检查,您忘记/不知道 Javascript 是如何强制转换的。 webreflection.blogspot.nl/2010/10/…
@ChristiaanWesterbeek:您的观点是 arg == null 产生与 arg === undefined || arg === null 相同的结果。但是,我认为后一个示例更具可读性。
arg == null 在我的经验中很常见。
遗憾的是,return value === (void 0) 比针对可能是范围内合法变量的 undefined 进行测试更安全。
@Sharky 未定义的变量和未声明的变量之间存在差异:lucybain.com/blog/2014/null-undefined-undeclared
答3:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
function isEmpty(value){
return (value == null || value.length === 0);
}
这将返回 true
undefined // Because undefined == null
null
[]
""
和零参数函数,因为函数的 length 是它采用的声明参数的数量。
要禁止后一类,您可能只想检查空白字符串
function isEmpty(value){
return (value == null || value === '');
}
undefined == null 但undefined !== null
@IanBoyd 那是因为您将 == 与 === 进行比较。这意味着 undefined == null (true) undefined != null (false) undefined === null (false) undefined !== null(true) 最好提供更多信息以便帮助和推动人们在正确的方向。关于差异的 moz 文档 developer.mozilla.org/en-US/docs/Web/JavaScript/…
答4:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
这是最安全的检查,我还没有看到它像这样张贴在这里:
if (typeof value !== 'undefined' && value) {
//deal with value'
};
它将涵盖从未定义价值的情况,以及以下任何一种情况:
无效的
未定义(未定义的值与从未定义的参数不同)
0
“”(空字符串)
错误的
钠
已编辑:更改为严格相等(!==),因为这是现在的规范;)
我没有投反对票,但是关于严格相等比较,一般规则是除非您需要隐式类型转换,否则应该使用严格比较。
感谢您的评论史蒂夫。这条一般规则很好。我只是希望人们能够理解他们为什么使用其中一种。你看起来的每一种方式都会很高兴向你宣扬“总是使用严格”——就像它是 Javascript 中最重要的东西一样。我见过太多像 if(val !== null) 这样的案例,这显然会导致不想要的结果。有疑问时可以说 - 使用严格,但最好不要有疑问。
我认为这里的重点是我们希望 typeof 运算符返回一个字符串,因此使用严格相等检查在技术上更准确、更具体、更快。所以真的,没有理由使用松散的比较,而不是相反。 val !== null 在许多情况下也完全有效——我一直都这样做。我同意你的不合格论点,但我认为这是一个糟糕的例子。不是想骗你。
@guya 这值得为 7 年后的编辑投票!尤其是考虑到当天的上述讨论;) 尊敬的先生!
我认为这是最易读的代码。在所有答案中,这应该是公认的答案。
答5:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
您可能会发现以下功能很有用:
function typeOf(obj) {
return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
或者在 ES7 中(如果有进一步改进,请评论)
function typeOf(obj) {
const { toString } = Object.prototype;
const stringified = obj::toString();
const type = stringified.split(' ')[1].slice(0, -1);
return type.toLowerCase();
}
结果:
typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map
“请注意,绑定运算符 (:😃 不是 ES2016 (ES7) 的一部分,也不是任何更高版本的 ECMAScript 标准。目前它是引入该语言的阶段 0(草编)提案。” ——西蒙·凯尔伯格。作者希望加入他对这一美丽提议的支持,以接受皇室提升。
+1 了解 'regexp' 类型的对象、“数组”和“函数”会很有帮助
@Vix,为什么 ES7 版本更好?
它不是,正在尝试使用更易读的方式来表达相同的功能:解构赋值,绑定运算符。
请注意,绑定运算符 (::) 不是 ES2016 (ES7) 的一部分,也不是任何更高版本的 ECMAScript 标准。它目前是引入该语言的第 0 阶段(稻草人)提案。
答6:
huntsbot.com – 高效赚钱,自由工作
评分最高的第一个答案是错误的。如果 value 未定义,它将在现代浏览器中引发异常。你必须使用:
if (typeof(value) !== "undefined" && value)
或者
if (typeof value !== "undefined" && value)
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
eee ...我认为这是错误的,因为 if(value) 就足够了(空对象/数组除外)。如果值为“未定义”,则“如果”条件不会通过。
这会将未定义的变量(在评估时引发 ReferenceError)混为一谈,这些变量与具有 undefined 值的变量不同。
我在这里遇到了同样的错误。如果 x 未定义,if(x)、if(!x)、if(!!x) 都会抛出错误。
if(value === 0) gameOver(); ;)
这个答案也是错误的,因为它在 value 为零时返回 false,这 not 是 op 正在寻找的。
答7:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
我非常喜欢的一个解决方案:
让我们定义一个空白变量是 null 或 undefined,或者如果它有长度,它是零,或者如果它是一个对象,它没有键:
function isEmpty (value) {
return (
// null or undefined
(value == null) ||
// has length and it's zero
(value.hasOwnProperty('length') && value.length === 0) ||
// is an Object and has no keys
(value.constructor === Object && Object.keys(value).length === 0)
)
}
回报:
真:未定义,空,“”,[],{}
假:真,假,1、0、-1、“富”、[1、2、3]、{富:1}
哇,非常感谢!最后,它排除了错误,这就是我要找的。否则,我试图修复的代码是从数组中删除项目,不仅是空值,还有有效的假值,必须记录在 else 条件中。就像 if (!value || value === '') { delete a.b[field]; } else { a.b[field] = {val: value, ... }; } - 一个非常明显但令人讨厌的错误;)
答8:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
此条件检查
if (!!foo) {
//foo is defined
}
是你所需要的全部。
我认为这只是一个片段。但是 if 已经进行了一次虚假检查,这只是将其转换为布尔值。它是否捕获了普通 if(foo) 没有捕获的任何情况?
这非常适合当您需要内联内容时,例如我需要一个反应属性(称为活动),当字符串不为空时它是正确的 - if 语句将是矫枉过正,所以我可以使用 active={!!foo}
除非 foo 为 0
有关更多信息,请参阅 MDN 上的 Double NOT (!!)。此外,如果 foo 为 0,则 !!foo 的计算结果为 false。
答9:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
看看新的 ECMAScript Nullish 合并运算符
您可以将此功能 - ?? 运算符 - 视为在处理 null 或 undefined 时“回退”到默认值的一种方式。
let x = foo ?? bar();
同样,上面的代码等价于下面的代码。
let x = (foo !== null && foo !== undefined) ? foo : bar();
直到这篇文章我才意识到 nullish 合并不会在 0 和空字符串上评估 false,这使它变得无限有用。谢谢!
答10:
huntsbot.com – 高效赚钱,自由工作
! 检查 空字符串 (“”)、null、undefined、false 以及数字 0 和 NaN。 说,如果字符串为空 var name = “” 则 console.log(!name)返回 true。
function isEmpty(val){
return !val;
}
如果 val 为空、null、未定义、false、数字 0 或 NaN,此函数将返回 true。
或者
根据您的问题域,您可以使用 !val 或 !!val。
这并不能真正说明变量是否为空,因为 false 和 0 可以是有效值并且不构成空值。拥有 isEmpty 函数的价值是确保您期望为空的值返回 true。在我看来,null、undefined、NaN 和空字符串是有意义的空值。
如果可以只使用 !val,为什么还要使用 isEmpty(val)?
它是由你决定。您可以使用它来增加可读性。否则,如果您认为您工作的团队是更高级的编码员,那么您可以根据您的问题域仅使用 !val 或 !!val。
答11:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
你有点过头了。要检查一个变量是否没有赋值,你只需要检查 undefined 和 null。
function isEmpty(value){
return (typeof value === "undefined" || value === null);
}
这是假设 0、“” 和对象(甚至是空对象和数组)都是有效的“值”。
与 null 的松散比较总是封装了这种确切的行为;这个函数相当于你的:let isEmpty = val => val == null;
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求