JS 判断字符串是否为空

JS 判断字符串是否为空从 ES6 开始 JS 共有 7 种数据类型 分为基本类型和引用类型两大类 基本类型 String Number Boolean Symbol Undefined Null 引用类型 Object object array function typeof 运算符返回变量或表达式的类型 通过 typeof 运算符可以粗略确定 JavaScript 变量的类型 typeof string typeof BillGates string typeof

在这里插入图片描述


1.数据类型

从 ES6 开始,JS 共有 7 种数据类型,分为基本类型和引用类型两大类。

基本类型:String、Number、Boolean、Symbol、Undefined、Null 引用类型:Object(object、array、function) 

typeof 运算符返回变量或表达式的类型,通过 typeof 运算符可以粗略确定 JavaScript 变量的类型。

typeof '' // "string" typeof 'Bill Gates' // "string" typeof 0 // "number" typeof 3.14 // "number" typeof false // "boolean" typeof true // "boolean" typeof Symbol() // "symbol" typeof undefined // "undefined" typeof null // "object" typeof { 
   name:'Bill', age:62} // "object" typeof [0, 1, 2] // "object" typeof function(){ 
   } // "function" typeof (()=>{ 
   }) // "function" 

需要注意的是,对 null、数组执行 typeof 结果是 “object”。

JS 是解释型弱类型编程语言,定义变量时无需指明类型,变量类型在程序执行时由实际值的类型决定,且可以直接赋予不同类型值来改变变量类型。

var foo = 'foo' foo = 123 console.log(foo) // 123 

2.正确优雅地判断字符串是否为空

弱类型给编程带了方便,但有这种灵活的成本并不廉价,因为一不小心就会出错。比如我们判断一个变量是空字符串可能会写成下面这个样子。

function isEmptyStr(s) { 
    if (s == '') { 
    return true } return false } 

如果之前经常写强类型语言,第一次写 JS 的话,很容易写出上面这种代码。但是因为 JS 是弱类型语言,只有执行表达式时才能确定 s 的类型,所以 s 可能并不是字符串类型,如果 s 是 undefined 或者 null,也认为是空的话,那么s == ''并不成立,得出错误的判断。把 undefined 和 null 当做空字符串。代码修改如下:

function isEmptyStr(s) { 
    if (s == undefined || s == null || s == '') { 
    return true } return false } isEmpty(undefined) // true isEmpty(null) // true isEmpty('') // true 

这样就对了吗?当你看到下面的结果,你可能跟我一样,想打人。

isEmptyStr(0) // true isEmptyStr(false) // true 

我只想安静地判断一个变量是不是空串,为啥 JS 给我整出这么多幺蛾子。这是因为 JS 把 0 和 false 的值与空串认为是等同的,所以出现了上面这种诡异的情况。我们需要使用 === 运算符加上类型的判断。JS 中 == 只判断值,=== 运算符需要在类型和值两方面同时相等才判为 true。

function isEmptyStr(s) { 
    if (s == undefined || s == null || s === '') { 
    return true } return false } 

有没有更简洁的写法呢?实际上 null 与 undefined 虽然不是东东,但是 JS 中规定,二者的值是相等的,只是类型不同。

null == undefiend // true null === undefined // false 

所以上面判断字符串是否为空串可以简写为:

function isEmptyStr(s) { 
    if (s == null || s === '') { 
    return true } return false } // 或 function isEmptyStr(s) { 
    if (s == undefined || s === '') { 
    return true } return false } isEmptyStr(undefined) // true isEmptyStr(null) // true isEmptyStr('') // true 

3.不是空串一定是“不空串”吗?

判断字符串是否为空可能会有人从相反的角度出发,即判断字符串不为空。

function isEmptyStrV2(s) { 
    if (typeof s == 'string' && s.length > 0) { 
    return false } return true } isEmptyStrV2(undefined) // true isEmptyStrV2(null) // true isEmptyStrV2('') // true 

细心的同学会发现,上面这个函数实际上并非和函数 isEmptyStr() 完全等同,因为当输入 undefined,null 和字符串类型外的变量时,两个函数的结果是不一样的。

// 对象 isEmptyStr({ 
   }) // false isEmptyStrV2({ 
   }) // true // 布尔 isEmptyStr(false) // false isEmptyStrV2(false) // true // 数值 isEmptyStr(1) // false isEmptyStrV2(1) // true 

出现这种情况的原因是入参可能并不是字符串,所以上面函数 isEmptyStrV2() 的结果是错误的,isEmptyStr() 的结果是对的,但是使用 isEmptyStr() 时也要注意不是空串不代表是不空串(有长度的字符串)。听起来有点难理解,这就是弱类型语言灵活带来的不便,给 coder 犯错提供了非常多的机会。

因为不是空串不代表是不空串,所以判断是否是空串不能从相反的角度出发,上面的函数 isEmptyStrV2() 是不可用的,还是需要直接判断是空串才行,因为空串和有长度的字符串之间还存在着小三(其他类型),三者关系如下:
在这里插入图片描述
同样地,当我们需要判断一个变量是有长度的字符串时,不能直接使用函数 isEmptyStr(),也要直接判断才行。




function isNotEmptyStr(s) { 
    if (typeof s == 'string' && s.length > 0) { 
    return true } return false } 

弱类型语言就是如此地任性,让我们这些经常写强类型语言的 coder 一下子有些难以适从。

4.小结

因为 JS 是弱类型语言,导致入参类型可能不是字符串,这给判断字符串是否为空带了很多不便。不是空串并不代表是不空串,所以判断字符串为空还是不为空要单独判断。

此外,在比较两个变量是否相等时,要注意什么时候使用 === 执行严格相等,什么时候使用 == 执行宽松相等的比较。

判断字符串为空:

function isEmptyStr(s) { 
    if (s == null || s === '') { 
    return true } return false } // 或 function isEmptyStr(s) { 
    if (s == undefined || s === '') { 
    return true } return false } 

判断字符串不为空:

function isNotEmptyStr(s) { 
    if (typeof s == 'string' && s.length > 0) { 
    return true } return false } 

参考文献

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199955.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:50
下一篇 2026年3月20日 上午11:50


相关推荐

  • 前端开发常用网站_软件开发领域知识

    前端开发常用网站_软件开发领域知识87个前端必备开发网站来源:https://zhuanlan.zhihu.com/p/86777413来源:https://zhuanlan.zhihu.com/p/86777413来源:htt

    2022年8月3日
    13
  • 服务器性能监视器_性能计数器感叹号

    服务器性能监视器_性能计数器感叹号文章来源:http://blog.csdn.net/lhfzd2004/article/details/1722379上一篇文章《服务器性能监控之WMI》介绍了通过远程com获取服务器性能(当然也可用于本地),那么这篇主要说说windows系统自带的性能监视功能—–>performancecouonter.打开管理工具–>性能,我们可以立即看到服务器的CPU,进程运行时间,磁盘容量

    2022年10月8日
    4
  • 自定义手机壁纸_ios怎么自定义动态壁纸

    自定义手机壁纸_ios怎么自定义动态壁纸拥有Android智能手机的主要好处之一就是自定义。有了足够的专业知识,您可以对它的几乎所有方面进行自定义9。值得扎根的Android惊人的定制9值得扎根的Android惊人的定制让您的设备扎根了吗?看完所有这些很棒的仅根定制之后,您可能会改变主意。阅读更多内容,但首先应该开始,是否打算建立根目录。什么是自定义ROM?了解AndroidLingo根源是什么?什么是自定义ROM?学习Android…

    2025年8月20日
    7
  • JavaSE基础(101) 遍历ArrayList集合的4种方式[通俗易懂]

    JavaSE基础(101) 遍历ArrayList集合的4种方式[通俗易懂]ArrayList遍历:取出ArrayList集合中的数据①:for循环②:增强for循环:foreach③:Iterator:迭代器④:ListIterator:双向迭代器ex:/***ArrayList遍历:取出ArrayList集合中的数据*①:for循环*②:增强for循环:foreach*③:Iterator:迭代器*④:…

    2022年7月22日
    16
  • 点到平面的基本距离推导公式

    点到平面的基本距离推导公式平面的一般式方程 Ax By Cz D 0 其中 n A B C 是平面的法向量 D 是将平面平移到坐标原点所需距离 所以 D 0 时 平面过原点 向量的模 长度 给定一个向量 V x y z 则 V sqrt x x y y z z 向量的点积 内积 给定两个向量 V1 x1 y1 z1 和 V2 x2 y2 z2 则他

    2026年3月17日
    4
  • AES加密解密(ECB模式)

    AES加密解密(ECB模式)高级加密标准 英语 AdvancedEncr 缩写 AES 在密码学中又称 Rijndael 加密法 是美国联邦政府采用的一种区块加密标准 这个标准用来替代原先的 DES 已经被多方分析且广为全世界所使用 经过五年的甄选流程 高级加密标准由美国国家标准与技术研究院 NIST 于 2001 年 11 月 26 日发布于 FIPSPUB197 并在 2002 年 5 月 26 日成为有

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号