是否有标准函数来检查 JavaScript 中的 null、未定义或空白变量?

问:

是否有一个通用的 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;

原文链接:https://www.huntsbot.com/qa/w73o/is-there-a-standard-function-to-check-for-null-undefined-or-blank-variables-in?lang=zh_CN&from=csdn

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值