3100

是否有一个通用JavaScript函数可以检查变量是否有值并确保它没有值未定义无效的? 我有这个代码,但我不确定它是否涵盖所有情况:

函数为空(val){返回(val===未定义||val==null||val.length<=0)?真:假;}
17
  • 197
    Protip,永远不要(真实的陈述)?真:假;.就这么做(真实陈述);. 评论 2017年8月2日17:55
  • 11
    @George Jempty不是傻瓜,因为另一个答案问到特别是,而这个问题是关于变量. 评论 2018年2月1日0:55
  • 4
    这个问题的正确答案完全取决于你如何定义“空白”。 评论 2018年2月1日1:03
  • 7
    @Jay它对代码的执行没有任何影响。这太冗长了。你不会说“你饿了吗?”你只是说“你饿了吗”所以在代码中只说如果(饿了)…而不是如果(饥饿===真)…。就像所有以这种方式编码的东西一样,这只是一个味道问题。更具体地说,对于OP提供的示例,他说得更详细了,“如果它是真的,那么是真的;如果不是,那么是假的”,但如果它是真实的,那么它已经是真的了。如果它是假的,那么它已经是假的了。这类似于说“如果你饿了,那么你饿了;如果不饿,那么你不饿了。” 评论 2019年1月30日22:58
  • 如果你想强制一个值成为一个真正的布尔值,你可以这样做!!价值。它只是两次“not”操作符,所以读起来像“not not value”,这是它的布尔值。 评论 2020年1月19日4:29

47个答案47

重置为默认值
5742

你可以检查一下变量有一个真实的值或否。这意味着

if(值){//做点什么。。}

将评估为真的如果价值:

  • 无效的
  • 未定义
  • NaN公司
  • 空字符串(“”)
  • 0

以上列表代表了所有可能的虚伪的ECMA-/Javascript中的值。在中查找规范ToBoolean(目标布尔值)部分。

此外,如果您不这样做知道变量是否存在(也就是说,如果它是宣布)你应该向类型操作员。例如

if(类型foo!==“未定义”){//foo可以被解析,它被定义}

如果你能确定变量至少声明了,您应该直接检查它是否有真实的值,如上图所示。

35
  • 187
    如果该值是预期的假布尔值,该怎么办。有时,如果没有值,则需要提供默认值,如果传入了false boolean,则该值无效。 评论 2012年12月30日22:38
  • 127
    @TruMan1:在这种情况下(您的逻辑指示验证),您必须这样做if(值||value===false)所有人都一样错误的值,我们需要显式地对其进行验证。
    – 安迪
    评论 2012年12月31日4:58
  • 40
    除非值是数组。解释真实的可能会产生误导。那样的话,我们应该检查一下value.length!=值0对于非空数组。
    – 用户
    评论 2014年4月18日21:06
  • 20
    如果你觉得如果构造在语法上太重了,可以使用三元运算符,如下所示:var结果=未定义?“真实”:“虚假”。或者,如果只想强制为布尔值,请使用!!操作员,例如。!!1//正确,!!空//假.
    – KFL公司
    评论 2014年8月26日7:24
  • 10
    还要注意,这不会检查只包含空白字符的字符串。 评论 2014年11月21日10:28
396

这个问题有两种解释:

检查变量是否有值
检查变量是否具有真实值

以下是两者的答案。

在JavaScript中,值可以是使无效或者不是nursh,值可以是虚伪的真实的.
Nullish值是错误值的适当子集:

╭─ 使无效──────╮ ╭─ 非无效─────────────────────────────────╮┌───────────┬──────┬───────┬───┬────┬─────┬──────┬───┬─────────┬─────┐未定义│空│假│0│“”│…│真│1│“你好”│└───────────┴──────┴───────┴───┴────┴─────┴──────┴───┴─────────┴─────┘╰─ 虚伪的───────────────────────────────╯ ╰─ 真实的───────────────╯

检查值是否为nursh(未定义或null)

根据您的编码风格,使用以下选项之一:

如果(value==null){/*value为nulsh*/}if(value===未定义||value===null){/*value为nulsh*/}如果(value==未定义){/*value为nulsh*/}if((value??null)===null){/*value为nulsh*/}

笔记:

  • 这个==操作员工作是因为它对空与未定义比较有一种特殊情况
  • 这个===运算符更具可读性(基于观点),对eqeqq友好,允许分别检查未定义和null
  • 第一个和第三个示例的工作原理相同,但第三个在生产代码中很少出现
  • 第四个示例使用零值合并操作符将零值更改为无效的用于直接比较

检查值是否为零

if(value!=null){/*value不是nursh,尽管它可能是falsy*/}if(value!==未定义&&value!==null){/*value不是nursh,尽管它可能是falsy*/}if(value!=undefined){/*value不是nursh,尽管它可能是falsy*/}if((值??null)!==null){/*值不是nursh,尽管它可能是falsy*/}

检查值是否错误

使用!操作员:

如果(!value){/*value为falsy*/}

检查值是否真实

如果(value){/*value为true*/}

数据验证

无效、虚假和真实检查不能单独用于数据验证。例如,0(falsy)是一个人的有效年龄,并且-1(truthy)不是。需要根据具体情况添加其他逻辑。一些示例:

/**检查值是否大于/等于0*注意,我们不能在这里使用真实检查,因为必须允许0*/[null,-1,0,1].forEach(num=>{if(num!=null&&num>=0){console.log(“%o不为nulsh且大于等于0”,num);}其他{console.log(“%o不正确”,num);}});/**检查值是否不是空字符串或空白字符串*/[null、“”、“”和“hello”].forEach(str=>{if(str&&//\S/.test(str)){console.log(“%o为truethy且具有非空白字符”,str);}其他{console.log(“%o不正确”,str);}});/**检查值是否不是空数组*在检查长度属性之前检查真实性*/[null,[],[1]].forEach(arr=>{if(arr&&arr.长度){console.log(“%o是真的,并且有一个或多个项目”,arr);}其他{console.log(“%o错误”,arr);}});/**检查值是否不是空数组*使用可选的链接运算符确保值不为零*/[null,[],[1]].forEach(arr=>{if(arr?.长度){console.log(“%o不是nursh,并且有一个或多个项”,arr);}其他{console.log(“%o错误”,arr);}});

9
  • 48
    仅检查无效的未定义可以这样做:if(值==空).注意==强制执行的运算符。如果你这样检查if(value===null||value===未定义),您忘记/不知道Javascript是如何强制的。webreflection.blogspot.nl/2010/10/… 评论 2014年7月3日11:46
  • 54
    @克里斯蒂安·韦斯特贝克:你的观点是arg==空产生的结果与arg===未定义|| arg====空然而,我认为后一个示例更具可读性。 评论 2014年7月7日4:02
  • 18
    arg==空在我的经历中很常见。 评论 2014年10月10日1:56
  • 9
    返回值===(void 0)比测试更安全未定义遗憾的是,这很可能是范围内的合法变量。
    – x0n个
    评论 2016年1月19日5:09
  • 8
    @Sharky未定义的变量和未声明的变量之间存在差异:lucybain.com/blog/2014/null-undefined-undeclared 评论 2016年10月17日10:22
133
函数为空(值){返回(值==null||value.length===0);}

这将返回true

undefined//因为undefined==null无效的[]""

和零参数函数,因为函数的长度是它所采用的声明参数数。

要禁止使用后一种类别,您可能只需要检查空白字符串

函数为空(值){return(value==null||value=='');}

Null或空白

函数为空(值){return(value==null||value.trim().length===0);}
  • 11
    未定义==空但是未定义!==无效的 评论 2014年2月22日15:06
  • 6
    @Ian Boyd那是因为你在比较==和===。这意味着undefined==null(true)undefined!=null(false)未定义===null(false)未定义!===null(true)最好提供更多信息,以便提供帮助并推动人们朝着正确的方向前进。关于差异的moz文档developer.mozilla.org/en-US/docs/Web/JavaScript/… 评论 2016年1月14日18:03
  • 1
    value.trim()将在这些值上崩溃:[],{} 评论 2022年11月7日18:39
73

这是最安全的支票,我还没有看到它像这样贴在这里:

if(值类型!==“未定义”&&value){//处理价值};

它将涵盖以下情况价值从未定义,也未定义以下任何内容:

  • 无效的
  • 未定义(未定义的值与从未定义的参数不同)
  • 0
  • “”(空字符串)
  • NaN公司

编辑:更改为严格等式(!==),因为它现在已经成为规范;)

4
  • 10
    我没有投反对票,但关于严格的平等比较,一般的规则是,除非你需要应该使用隐式类型转换而不是严格比较。 评论 2013年12月4日8:45
  • 4
    谢谢你的评论,史蒂夫。这个一般规则很好。我只是希望人们能理解他们为什么使用其中一个。无论你看起来如何,人们都会很高兴地向你宣扬“始终使用严格”——就像它是Javascript中最重要的东西一样。我见过太多这样的案例if(val!==空)这显然会导致不想要的结果。当有疑问时,可以说使用严格,但最好不要有疑问。
    – 古雅
    评论 2013年12月7日22:11
  • 7
    我认为这里的重点是我们希望类型操作符返回字符串,这样使用严格的相等性检查在技术上更准确、更具体、更快。因此,实际上,没有理由使用松散的比较,而不是相反的方法。阿尔索val!==无效的在许多情况下都是完全有效的-我一直都这样做。我同意你的非一致性论点,但我认为这是一个糟糕的例子。不是想欺负你。 评论 2014年10月10日2:10
  • 谢谢你的评论Bryan,你用val!==空,因为你知道自己在做什么。初学者会想回到val为falsy的时候。但是,val永远不会为空,它将是未定义的。如果他不听从“总是严格使用”的建议,他就会少一些臭虫。我在生产代码中见过这种情况。typeof总是返回一个字符串,速度差异将是多余的。因此,在上述情况下使用strict的唯一理由是一致性。我说过“不需要严格的平等”。这并不意味着如果你想这样做,或者如果这样做可以使你的代码更加一致,你就不能这样做。
    – 古雅
    评论 2014年10月11日2:26
36

我非常喜欢的解决方案:

让我们定义一个空白变量无效的,或未定义,或者如果它有长度,则为零;如果它是一个对象,则没有键:

函数为空(值){返回(//null或未定义(值==空)||//长度为零(value.hasOwnProperty(“长度”)&&value.length===0)||//是一个对象,没有键(value.constructor===对象和对象.keys(value).length===0))}

退货:

  • 正确: 未定义,无效的,"",[],{}
  • 错误: 真的,,1,0,-1,“foo”,[1, 2, 3],{foo:1}
1
  • 哇,非常感谢!最后,它排除了false,这就是我想要的。否则,我试图修复的代码将从数组中删除项,这不仅是针对空值,而且还针对必须记录在else条件中的有效false值。这就像是if(!value||value==''){删除a.b[field];}否则{a.b[feld]={val:value,…};}-这是一个很明显但很烦人的错误;)
    – RAM237型
    评论 2022年3月25日13:48
36

看看新的ECMAScriptNullish凝聚算子

你可以想到这个功能-??运算符-作为处理时“回退”到默认值的方法无效的未定义.

设x=foo??bar();

同样,上面的代码等效于下面的代码。

让x=(foo!==空&&foo!==未定义)?foo:bar();
4
  • 直到这篇文章之前,我才意识到,nursh合并不会在0和空字符串上计算false,这使得它更加有用。谢谢您! 评论 2021年11月2日16:13
  • 我喜欢用如果((x??null)===null)检查无效的未定义 评论 2023年3月22日12:38
  • 同样的想法也适用??=。示例:名称??='鲍勃等于name=(name!==null&&name!==未定义)?name:'bob'.doc:空合并赋值(??=)
    – 锡石
    评论 2023年4月4日11:41
  • 这是迄今为止回答变量是否有赋值问题的最佳解决方案。然而,这并不能解决最初的问题,即变量是否为空。他们希望将“”和[]都视为空。 评论 2023年10月18日11:57
32

您可能会发现以下功能很有用:

函数类型Of(obj){return{}.toString.call(obj).split('')[1]切片(0,-1).toLowerCase();}

或在ES7中(如有进一步改进,请发表评论)

函数类型Of(obj){const{toString}=对象原型;const stringified=对象::toString();常量类型=stringified.split('')[1].slice(0,-1);return type.toLowerCase();}

结果:

typeOf()//未定义typeOf(空)//无效的类型Of(NaN)//typeOf(5)//typeOf({})类型//对象typeOf([])//阵列typeOf(“”)//一串typeOf(函数(){})//功能typeOf(/a/)//正则表达式typeOf(new Date())//日期typeOf(new WeakMap())//WeakMaptypeOf(new Map())//映射

“请注意,绑定操作符(::)根本不是ES2016(ES7)或ECMAScript标准的任何后续版本的一部分。它目前是引入该语言的第0阶段(稻草人)建议。”–西蒙·凯尔伯格。作者希望对这一美丽的建议加上支持,以获得王室提升。

4
  • +1了解类型的对象很有帮助“regexp”、“数组”和“函数”
    – 雅什
    评论 2015年10月5日6:58
  • @Vix,为什么ES7版本更好? 评论 2017年9月3日4:26
  • 事实并非如此,我们正在尝试使用更易读的方式来表达相同的功能:破坏赋值、绑定操作符。
    – Vix公司
    评论 2017年9月3日13:37
  • 4
    请注意,bind操作符(::)不是ES2016(ES7)或ECMAScript标准的任何后续版本的一部分。目前,这是一个引入该语言的0级(斯特拉曼)提案。 评论 2018年2月12日18:54
30

此条件检查

if(!!foo){//定义了foo}

就是你所需要的。

5
  • 我假设这只是一个片段。但是如果已经做了一个错误的检查,这只是将其转换为布尔值。它是否捕捉到任何正常情况if(foo)没有抓住? 评论 2017年6月28日7:38
  • 2
    当您需要内联的东西时,这是完美的选择,例如我需要一个在字符串不为空时为真的反应属性(称为active)-if语句将被过度使用,因此我可以使用活动={!!foo} 评论 2018年1月23日20:01
  • 20
    除非foo为0
    – 高尔基
    评论 2020年6月22日5:36
  • 2
    有关更多信息,请参阅MDN双NOT(!!)此外,如果foo公司0,然后!!foo公司计算结果为.
    – 大卫RR
    评论 2021年11月9日20:37
  • 不!这与原始问题的逻辑相反,是一种测试isEmpty的方法。如果未定义或为null,则返回true。但更进一步,这并没有解决0和“”是虚假的这一事实。 评论 2023年10月18日11:55
28

评级最高的第一个答案是错误的。如果值未定义,则会在现代浏览器中引发异常。您必须使用:

if(typeof(value)!==“未定义”&&值)

if(值类型!==“未定义”&&value)
6
  • eee。。。我认为这是错误的,因为(value)就足够了(空对象/数组除外)。如果值为“undefined”,则不会传递“if”配置。 评论 2014年10月15日14:09
  • 4
    这将合并未定义的变量(在求值时抛出ReferenceError),这些变量与未定义值。 评论 2015年1月16日14:04
  • 2
    我这里也有同样的错误。如果(x),如果(!x),if(!!x)都会在x未定义时抛出错误。
    – 绍什语
    评论 2015年6月6日0:51
  • 如果(value===0)gameOver();;) 评论 2018年2月1日0:53
  • 这个答案也是错误的,因为当价值为零,即op正在寻找什么。 评论 2018年2月1日1:02
22

真空度

我不建议尝试定义或使用计算整个世界中是否有任何值为空的函数。“空”到底意味着什么?如果我有让人类={name:'bob',胃:'empty'},应该是空的(人类)返回真的? 如果我有let reg=新RegExp(“”);,应该是空的(reg)返回真的? 关于isEmpty([null,null,null,null])-这个列表只包含空,所以列表本身是空的吗?我想在这里对javascript中的“真空”(一个故意晦涩的词,以避免预先存在的关联)提出一些注释,我想说的是,javascript值中的“空虚”永远不应该被泛化处理。


真实性/虚假性

为了决定如何确定值的“空洞性”,我们需要考虑javascript内置的内在感觉,即值是“真实的”还是“虚假的”。当然,无效的未定义都是“假的”。不那么自然,数字0(除NaN公司)也是“虚假的”。自然最少:''是假的,但是[]{}(和新集合()、和新建地图())都是真实的,尽管它们看起来都同样空虚!


空与未定义

还有一些关于无效的未定义-我们真的需要两者来表达我们程序中的空虚吗?我个人避免未定义出现在我的代码中。我总是使用无效的表示“空虚”。不过,我们需要再次适应javascript固有的无效的未定义不同之处:

  • 试图访问不存在的属性会导致未定义
  • 调用函数时省略参数会导致接收该参数未定义:

设f=a=>a;console.log(f('hi'));console.log(f());

  • 具有默认值的参数仅在给定时接收默认值未定义,不是无效的:

设f=(v='hello')=>v;console.log(f(null));console.log(f(未定义));

对我来说,无效的是空虚的明确象征;“本可以填写的内容故意留白”。

真的?未定义是允许一些js特性存在的必要复杂性,但在我看来它应该永远被留在幕后;未与直接交互.我们可以考虑未定义例如,javascript实现默认函数参数的机制。如果您不向函数提供参数,它将收到一个值未定义而不是。如果函数参数最初设置为未定义在这种情况下未定义是默认函数参数的关键,但它停留在后台:我们可以实现默认参数功能,而无需引用未定义:

这是一个错误的默认参数实现,因为它直接与未定义:

let fnWithDefaults=参数=>{如果(arg===未定义)arg='default';...};

这是一个很好的实施:

让fnWithDefaults=(arg='default')=>{…};

接受默认参数的方式不太好:

fnWithDefaults(未定义);

只需这样做:

fnWithDefaults();

顺便说一句:您是否有一个具有多个参数的函数,并且希望在提供一些参数的同时接受其他参数的默认值?

例如。:

设fnWithDefaults=(a=1,b=2,c=3,d=4)=>console.log(a,b,c,d);

如果要为提供值d日并接受其他人的默认值,该怎么办?这似乎是错误的:

fn默认值(10,未定义,未定义40);

答案是:重构fnWith默认值要接受单个对象:

设fnWithDefaults=({a=1,b=2,c=3,d=4}={})=>console.log(a,b,c,d);fnWithDefaults({a:10,d:40});//现在这个看起来真不错!(从不谈论“未定义”)

非通用真空

我认为,永远不应该以通用的方式来处理空虚。相反,在确定数据是否为空之前,我们应该始终严格获取有关数据的更多信息——我主要通过检查我正在处理的数据类型来做到这一点:

设isType=(值,Cls)=>{//有意使用松散比较运算符检测`null`//还有“未定义”,什么都没有!返回值!=null&&Object.getPrototypeOf(value).constructor===Cls;};

请注意,此函数忽略继承-它需要价值成为…的直接实例Cls公司,而不是的子类的实例Cls公司.我回避运算符主要有两个原因:

  • ([]对象实例)===true(“数组是对象”)
  • (字符串的“”实例)===false(“字符串不是字符串”)

请注意对象.get原型用于避免(模糊的)边缘外壳,例如让v={constructor:String};这个is类型函数仍然正确返回isType(v,字符串)(错误),以及isType(v,对象)(正确)。

总的来说,我建议使用这个is类型功能以及以下提示:

  • 最小化未知类型值的代码处理量。例如,用于让v=JSON.parse(someRawValue);,我们的v(v)变量现在的类型未知。我们应该尽早限制我们的可能性。最好的方法是要求特定类型:例如。if(!isType(v,Array))引发新错误(“预期数组”);-这是消除v(v),并确保它始终是阵列然而,有时我们需要允许v(v)具有多种类型。在这种情况下,我们应该创建代码块,其中v(v)不再通用,请尽早:

if(isType(v,String)){/*v在这个块中不是通用的-它是一个字符串*/}else if(isType(v,Number)){/*v在这个块中不是通用的-它是一个数字*/}else if(isType(v,Array)){/*v在这个块中不是通用的,它是一个数组*/}其他{throw new Error(“预期字符串、数字或数组”);}

  • 始终使用“白名单”进行验证。如果您需要一个值,例如String、Number或Array,请检查这三种“白色”可能性,如果三种可能性都不满足,则抛出Error。我们应该能够看到,检查“黑色”可能性并不是很有用:比如我们写如果(v===null)抛出新错误(“null value rejected”);-这对确保无效的价值观无法通过,但如果成功了,我们仍然对它一无所知。一个值v(v)通过这个空检查的仍然是非常通用的-它是除了什么无效的! 黑名单很难消除普遍性。
  • 除非值为无效的,永远不要考虑“一个空洞的值”。相反,考虑“一个空洞的X”。从本质上讲,永远不要考虑像if(isEmpty(val)){/*…*/}-不管怎样栈空函数已实现(我不想知道…),它没有意义!而且它太普通了!只有在了解以下内容的情况下才能计算真空度val值的类型。真空度检查应如下所示:
    • “一个没有字符的字符串”:if(isType(val,String)&&val.length===0)。。。

    • “对象,具有0个道具”:if(isType(val,Object)&&Object.entries(val).length===0)。。。

    • “等于或小于零的数字”:if(isType(val,Number)&&val<=0)。。。

    • “数组,没有项目”:if(isType(val,Array)&&val.length===0)。。。

    • 唯一的例外是无效的用于表示某些功能。在这种情况下,可以这样说:“空值”:如果(val===空)。。。

0
21

你做得有点过头了。要检查变量是否没有给定值,只需要检查未定义和null。

函数为空(值){return(typeofvalue===“undefined”||value===null);}

这是假设0,""、和对象(即使是空对象和数组)都是有效的“值”。

1
  • 2
    无效的一直都包含着这种确切的行为;此功能相当于您的:让isEmpty=val=>val==null; 评论 2022年3月9日17:54
21

!检查空字符串(“”)、null、undefined、false以及数字0和NaN。比如,如果字符串为空var name=“”然后console.log(!name)收益真的.

函数为空(val){返回!val;}

如果val值空、null、未定义、false、数字0或NaN.

根据您的问题域,您可以使用!val值!!val值.

  • 这并不是说变量是否为空,因为false和0可以是有效值,并且不构成空值。使用isEmpty函数的价值是确保您期望的空值返回true。在我看来,null、undefined、NaN和空字符串是有意义的空值。 评论 2016年1月14日18:09
  • 20
    为什么使用isEmpty(val)(为空)如果你能做到的话!val值? 评论 2016年4月15日0:44
  • 这取决于你。您可以使用它来提高可读性。否则,如果你认为你工作的团队更先进,那么你可以使用!val值!!val值根据你的问题域。
    – 阿里夫
    评论 2016年4月16日9:09
14

最简短的答案可能是

val==null||val==''

如果你把右侧换成val===“”那么空数组将给出false。证明

函数为空(val){返回val==null||val==''}// ------------//测试// ------------var log=(name,val)=>控制台.log(`${name}->${isEmpty(val)}`);log('null',null);log(“未定义”,未定义);log('NaN',NaN);日志(“”,“”);日志(“{}”,{});日志('[]',[]);日志(“[1]”,[1]);日志(“[0]”,[0]);日志('[[]]',[[]]);log('true',true);日志(“false”,false);log(“true”,“true“);日志(“false”,“false”);log(“不确定性”,无限性);log('-Infinity',-Infinity);log('1',1);日志('0',0);日志('-1',-1);日志(“1”,“1”);日志(“0”,“0”);日志(“-1”,“-1”);//“void 0”案例console.log('---\n“true”是:',true);console.log(“void 0”是:',void 0);日志(void 0,void 0);//“void 0”是“未定义的”-所以我们应该得到这里的TRUE

有关的更多详细信息==(来源在这里)

在此处输入图像描述

奖金:原因=====

在此处输入图像描述

写得清晰易懂可理解的代码,使用明确的可接受值列表

val===未定义||val===null||val==''||(Array.isArray(val)&&val.length===0)

函数为空(val){return val===未定义||val===null||val==''||(Array.isArray(val)&&val.length===0)}// ------------//测试// ------------var log=(name,val)=>控制台.log(`${name}->${isEmpty(val)}`);log('null',null);log(“未定义”,未定义);log('NaN',NaN);日志(“”,“”);日志(“{}”,{});日志('[]',[]);日志(“[1]”,[1]);日志(“[0]”,[0]);日志('[[]]',[[]]);log('true',true);日志(“false”,false);log(“true”,“true“);日志(“false”,“false”);log(“不确定性”,无限性);log('-Infinity',-Infinity);log('1',1);日志('0',0);日志('-1',-1);日志(“1”,“1”);日志(“0”,“0”);日志(“-1”,“-1”);//“void 0”案例console.log('---\n“true”是:',true);console.log(“void 0”是:',void 0);日志(void 0,void 0);//“void 0”是“未定义的”-所以我们应该得到这里的TRUE

  • 有用的可视化!它们的来源是什么? 评论 2020年6月21日20:36
  • 1
    @viam0Zah链接到源代码位于代码段-->下面(来源于此) 评论 2020年6月21日20:45
  • 如果val类型的字符串赋值为“undefined”?
    – 胜利者
    评论 2022年6月27日18:28
12

这里是我的-如果值为null、undefined等或空白(即仅包含空格),则返回true:

函数字符串IsEmpty(值){返回值?value.trim().length==0:true;}
1
  • 1
    我在这里对几种方法进行了测试。通过检查未定义项,您的函数工作得很好。所以我使用if(typeof value!=='undefined'&&!IsEmpty(value))或者,如果您确实想检查是否为空,可以使用if。这将适用于null;未定义;0; ""; " "; 评论 2020年1月30日10:43
10

如果您喜欢纯javascript,请尝试以下操作:

/***检查“value”是否为空。数组、字符串或“参数”对象*长度为“0”且对象没有自己的可枚举属性*“空”。**@静态*@memberOf_*@category对象*@param{Array | Object | string}value要检查的值。*@returns{boolean}如果“value”为空,则返回“true”,否则返回“false”。*@示例**_.为空([1,2,3]);*//=>假**_.为空([]);*//=>真**_.isEmpty({});*//=>真**_.is空('');*//=>真*/函数为空(值){if(!value){返回true;}if(isArray(value)||isString(value,值)){返回!值.长度;}for(var键值){if(hasOwnProperty.call(value,key)){返回false;}}返回true;}

否则,如果您已经在使用下划线或lodash,请尝试:

_.isEmpty(值)
6
  • 已尝试您的代码。我在控制台中收到一条错误消息:“Uncaughtreferenceerror:isArray()is not defined”。否则,如果它能起作用就太好了。 评论 2015年10月22日18:58
  • 12
    至少在lodash的情况下,_.为零是你要找的函数,不是_.is空.isNil文档,isEmpty文档
    – 狙击手
    评论 2016年5月29日2:07
  • 1
    如果值为布尔值且值为true,则此操作将失败。 评论 2017年4月24日19:28
  • 普通javascript没有isArray(isArray)isString(isString)上的函数窗口.
    – G油83
    评论 2017年10月15日19:49
  • 4
    @l3x:这是玩笑吗?
    – 莱伊-
    评论 2019年4月4日15:01
8
return val ||'处理空变量'

是在很多地方处理它的一种非常好且干净的方法,也可以用于分配变量

const res=val | |'默认值'
2
  • 很多地方,但默认情况下没有真的你试图提供或返回val值属于. 评论 2019年3月20日0:42
  • @Molomby是一种非常特殊的边缘情况,但即使这样也很容易处理const res=falsyValue?true:falsyValue
    – 立方形
    评论 2019年3月21日13:50
7

如果尚未声明变量,则无法使用函数测试未定义的变量,因为会出现错误。

if(foo){}函数(bar){}(foo)

如果尚未声明foo,两者都会生成错误。

如果要测试变量是否已声明,可以使用

foo类型!=“未定义”

如果您想测试foo是否已经声明并且它有一个值,您可以使用

if(foo的类型!=“未定义”&&foo){//此处输入代码}
7

您可以使用零合并操作符??检查无效的未定义值。请参阅MDN文档

空??'默认字符串';//返回“默认字符串”0 ?? 42;  // 返回0(null||未定义)??“foo”;//返回“foo”
6

检查默认值

函数类型OfVar(obj){return{}.toString.call(obj).split('')[1]切片(0,-1).toLowerCase();}函数isVariableHaveDefaltVal(变量){if(typeof(variable)===“字符串”){//number,boolean,string,objectconsole.log('单引号/双引号之间的任何数据都被视为字符串');return(variable.trim().length===0)?真:假;}else if(typeof(variable)===“boolean”){console.log('布尔值,默认值为“false”);返回(变量===false)?真:假;}else if(typeof(variable)===“未定义”){log('EX:var a;变量已创建,但默认值为undefined.');返回true;}else if(typeof(variable)===“数字”){console.log('number:'+变量);返回(变量===0)?真:假;}else if(typeof(variable)===“对象”){//-----对象-----if(typeOfVar(variable)==“array”&&variable.length==0){console.log('\t长度为'+[].length的对象数组);//Object.keys(变量)返回true;}else if(typeOfVar(variable)===“字符串”&&variable.length===0){console.log('\t长度为'+variable.length的对象字符串);返回true;}else if(typeOfVar(variable)===“boolean”){console.log('\t对象布尔值='+变量);返回(变量===false)?真:假;}else if(typeOfVar(variable)===“数字”){console.log('\t对象编号='+变量);返回(变量===0)?真:假;}else if(typeOfVar(variable)===“regexp”&&variable.source.trim().length===0){console.log('\t对象正则表达式:');返回true;}else if(变量===null){console.log('\t对象空值');返回true;}}返回false;}var str=“适合任何场合的篮子”;str=str.replace(/\s/g,“-”);//正则表达式中的“g”标志将替换所有空格。

检查结果:

isVariableHaveDefaltVal(“”);//字符串isVariableHaveDefaltVal(假);//布尔值变量a;isVariableHaveDefaltVal(a);isVariableHaveDefaltVal(0);//数字isVariableHaveDefaltVal(parseInt(“”));//NAN是NAN(“”);-真的isVariableHaveDefaltVal(空);isVariableHaveDefaltVal([]);isVariableHaveDefaltVal(//);isVariableHaveDefaltVal(新对象(“”));isVariableHaveDefaltVal(新对象(false));isVariableHaveDefaltVal(新对象(0));typeOfVar(函数(){});

我使用@Vix函数()检查对象的类型。

使用instansof«

var prototypes_or_Literals=函数(obj){开关(对象类型){//对象原型case“对象”:if(obj实例数组)return“[object Array]”;else if(obj实例日期)return“[对象日期]”;else if(RegExp的obj实例)返回“[object regexp]”;else if(obj instanceof String)return'[object String]';else if(obj instanceof Number)return“[对象编号]”;其他的return“object”;//对象文字违约:返回类型(obj);}   };输出测试«prototypes_or_Literals(“”)//“string”prototypes_or_Literals(新字符串(“”))//“[object String]”Object.prototype.toString.call(“foo bar”)//“[Object String]”
1
  • 比较运算符检查==[数据]===[数据,对象类型]JS数字始终存储为双精度浮点数字,遵循国际IEEE 754标准。//数字类型[int,float literals]var int=77;var浮动=77.7;console.log(int.toFixed(10)+'\t'+float.toFix(10));//对象类型var编号=新编号(77);if(int!=float)console.log('数据不相等');if(int==number&&int!==number)console.log('数据相等,类型不同');
    – 雅什
    评论 2016年1月25日10:20
6
函数isEmpty(obj){if(typeofobj=='number')返回false;else if(typeof obj=='string')返回obj.length==0;else if(Array.isArray(obj))返回obj.length==0;else if(typeof obj=='object')返回obj==null || object.keys(obj).length==0;else if(typeof obj==‘boolean’)返回false;否则返回!对象;}

在ES6中,使用trim处理空白字符串:

常量为空=值=>{if(typeof value===“数字”)返回falseelse if(typeof value===“string”)返回value.trim().length===0else if(Array.isArray(value))返回值.length===0else if(typeof value===“object”)返回值==null | | object.keys(value).length==0else if(typeof value===“boolean”)返回false否则返回!价值}
2
  • 1
    功能很棒,谢谢!处理每种类型的值-数字在所有其他解决方案中都被忽略了! 评论 2018年10月5日12:44
  • 2
    @FabianvonElerts请不要试图在其他人的答案中编辑其他代码。将其作为自己的答案发布,作为答案下的评论,或在评论中要求他们自己更新答案。
    – 泰勒H
    评论 2018年10月5日13:52
6

它可能有用。

数组中的所有值都表示您想要的值(空值、未定义值或其他值),您可以在其中搜索您想要的内容。

var variablesWhatILookFor=[null,undefined,''];variablesWhatILookFor.indexOf(document.DocumentNumberLabel)>-1
4
  • 2
    你能解释一下吗。那里发生了什么事 评论 2018年1月6日19:07
  • 数组包含一些假定为空的变量。
    – 达格桑
    评论 2018年12月11日12:07
  • @JoshKisb数组中的所有值都表示您想要的值(空值、未定义值或其他值),您可以在其中搜索您想要的内容。
    – 达格桑
    评论 2019年6月14日10:29
  • 2
    @虽然JoshKisb可能会感谢你的回复,但你应该在回答中而不是在评论中解释 评论 2019年6月14日10:32
5

如果您正在使用类型脚本不想解释“价值观"那么这就是您的解决方案:

第一:从“util”导入{isNullOrUndefined};

然后:为空或未定义(this.yourVariableName)

请注意:如前所述在下面现在已弃用,请使用value===未定义|| value====空而不是。裁判.

  • 2
    我觉得这很酷,所以一开始我没有投票,但Node.js已经被否决了。类型定义文件显示:/**@v4.0.0之后已弃用-请改用“value===null||value==undefined”*/ 评论 2018年10月2日22:16
  • 在这里:nodejs.org/api/util.html#util_util_sullorundefined_object另外:“我觉得这很酷,所以我一开始投赞成票“应为:) 评论 2018年10月4日20:21
  • 1
    为什么deprecate会是这样一个有用的简单东西?鹅。
    – 滴答声
    评论 2020年1月21日22:01
5

如果您想避免在值为以下任一值时变为true,请根据jAndy的回答:

  • 无效的
  • 未定义
  • NaN公司
  • 空字符串(“”)
  • 0

一个可能避免获得真实值的解决方案如下:

功能可用(值ToCheck){if(valueToCheck===0|//如果值为0,请避免返回false。valueToCheck===“”||//如果值为空字符串,请避免返回false。valueToCheck===false | |//如果值为false,请避免返回false。valueToCheck)//如果它不是null、undefined或NaN,则返回true。{返回true;}其他{返回false;}}

它的用法如下:

if(可用(x)){//它是可用的!}//确保避免将逻辑NOT运算符放在参数(isUsable(!x))之前,而是在函数之前使用它来检查返回值。if(!可用(x)){//它不可用!}

除了这些场景外,如果对象阵列为空:

你可以这样做:

函数isEmptyObject(值ToCheck){if(valueToCheck的类型==='object'&&!object.keys(valueToCheck).length){//对象为空!返回true;}其他{//对象不为空!返回false;}}函数为EmptyArray(valueToCheck){if(Array.isArray(valueToCheck)&&!检查长度的值){//数组为空!返回true;}其他{//数组不为空!返回false;}}

如果要检查所有空白字符串(“”),可以执行以下操作:

函数isAllWhitespace(){if(valueToCheck.match(/^*$/)!==null){//都是空白!返回true;}其他{//不是所有的空格!返回false;}}

注:拥有自己的财产如果变量声明为空字符串、0、false、NaN、null和未定义字符串中的任何一个,则返回true,因此可能不是最好的使用方法。可以修改函数以使用它来表明它已声明,但不可用。

5

尝试不同的逻辑。您可以使用下面的代码检查所有四(4)个验证条件,如不为null、不为空白、未定义和不为零,只需在javascript和jquery中使用此代码(!(!(variable))。

函数myFunction(){var数据//值可以是null、blank、undefined、zero,您可以测试if(!(!(数据)){警报(“数据”+数据);} 其他{警报(“数据是”+数据);}}
1
  • 这是唯一且独占的逻辑,请使用并尝试一次。这与上述逻辑不同。 评论 1月11日13:12
4

当引用或函数可能未定义或为空时,可选的链接操作符提供了一种简化通过连接对象访问值的方法。

让客户={name:“卡尔”,详细信息:{年龄:82岁,地点:“天堂瀑布”//详细地址未知}};let customerCity=customer.details?。地址?。城市;

可以在可选链接之后使用零合并运算符,以便在找不到默认值时生成默认值:

让客户={name:“卡尔”,详细信息:{年龄:82}};const customerCity=客户?。城市??“未知城市”;console.log(customerCity);//未知城市
函数为空(val){返回!val;}

但是这个解决方案是过度设计的,如果您不想在以后修改函数以满足业务模型的需要,那么直接在代码中使用它会更干净:

if(!val)。。。
var myNewValue=myObject和myObject.child;

这永远不会抛出错误。如果我的对象,小孩,或myValue(我的值)则为null我的新值将为空。不会抛出错误

对于所有来这里提出类似问题的人来说,以下内容非常有用,我在过去几年的图书馆里都有:

(函数(g3,$,窗口,文档,未定义){g3.utils=g3.utils|{};/********************************函数类型()*********************************返回对象构造函数的小写字符串表示。*@模块{g3.utils}*@函数{g3.utils.type}*@公共*@param{Type}“obj”是任何类型的本机、主机或自定义。*@return{String}返回表示对象*构造函数,如果它们不是自定义的,则与单词“对象”不同。*@参考http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/* http://stackoverflow.com/questions/3215046/disferenting-between-arrays-and-hashes-in-javascript* http://javascript.info/tutorial/type-detection*******************************************************************************/g3.utils.type=函数(obj){if(obj===空)return“null”;else if(对象类型===“未定义”)return'undefined';return Object.protype.toString.call(obj).match(/^\[Object\s(.*)\]$/)[1].toLowerCase();};}(window.g3=window.g3||{},jQuery,窗口,文档);

GitHub上的代码

常量为空=值=>((!value&&value!==0&&values!==false)||(Array.isArray(value)&&value.length===0)||(isObject(值)&&Object.keys(值).length===0)||(值的类型。大小===“数字”&&value.size===0)//`WeekMap.length`应该存在!?||(值的类型。长度==='数字'&&值的类型!=='函数'&&value.length===0));//资料来源:https://levelup.gitconnected.com/javascript-check-if-a-variable-is-an-object-and-nothing-else-not-an-array-a-set-etc-a3987ea08fd7const isObject=值=>Object.prototype.toString.call(value)===“[对象对象]”;

穷人的测试😁

常数测试=()=>{const run=(标签,值,预期值)=>{常量长度=values.length;console.group(`${label}(${length}测试)`);值.map((v,i)=>{console.assert(预期为isEmpty(v)===,`${i}:${v}`);});控制台.groupEnd();};常量空=[null,未定义,NaN,“”,{},[],new Set()、new Set,];常量notEmpty=[“”,“a”,0,1,-1,false,true,{a:1},[0],新集合([0]),新映射([['a',1]]),new WeakMap().set({},1),new Date(),/a/,new RegExp(),()=>{},];常量shouldBeEmpty=[{undefined:undefined},新映射([[]]),];run('EMPTY',空,真);run('NOT EMPTY',notEmpty,false);run(“应该为空”,shouldBeEmpty,true);};

测试结果:

空(10次测试)非空(16次测试)应为空(2次测试)断言失败:0:[object object]断言失败:1:[object Map]
  • 功能很好,这里所有的其他答案都有多个问题,你的答案似乎解决了这些问题,我只是希望我在写自己的答案之前找到它:p想你可能想看看我的作品stackoverflow.com/questions/5515310/…我们的两个函数的输出似乎完全相同,但我减少了一些代码。如果我错过了什么,请告诉我。 评论 2020年4月21日18:30
  • 👍 你试过我的“穷人测试”了吗?我想我最终在函数中为Map、WeakMap以及Date、RegExp等特殊情况添加了更多测试。你确定你的value.constructor===对象? 检查. 评论 2020年4月23日2:43
  • 是的,我确实运行了您的测试,感谢您的支持,我们的两个函数都返回了相同的测试结果。我一直在想,除了这些测试用例之外,我是否遗漏了什么。我相信value.constructor===对象好的,在javascript中,IF OR语句具有执行顺序,因此OR语句只在前面的语句没有返回TRUE并且我们已经检查过的情况下执行无效的事实上,最后一条OR语句的唯一目的是检测{}并确保不应该返回TRUE。 评论 2020年4月23日9:01
2
函数notEmpty(值){return(typeof value!==“undefined”&&value.trim().length);}

它还将检查空格(“”)以及以下内容:

  • null,未定义,NaN,空,字符串(“”),0,false

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.