当前位置: 首页 > news >正文

HarmonyOS StrUtil 字符串判空三兄弟:isNull、isEmpty、isBlank 到底有啥区别?

文章目录

    • 背景
      • 方法总览
      • isNull:只管"有没有值"
      • isEmpty:判断"有没有内容"
      • isBlank:最严格的那个,连空格也不放过
      • 三个方法的对比一览
      • 什么场景用哪个?
      • 完整 Demo 代码
      • 写在最后

背景

近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓
搞 HarmonyOS 开发,字符串判空是绕不过去的坎。很多初学者写代码的时候,遇到空值处理就习惯性地写if (str === null || str === undefined || str === '')这一长串。烦不烦?

HoUtils 里的StrUtil提供了三个判空方法,名字看着像,实际行为差别挺大。今天就把这三兄弟说清楚。

方法总览

isNull:只管"有没有值"

isNull只判断一件事:这个变量是不是null或者undefined

注意,它不管字符串内容,哪怕你传个空字符串"",它也返回false,因为空字符串是一个合法的值,不是 null。

// 点击按钮触发,直接从 Demo 日志中对应this.addLog(`isNull("${this.inputStr}") →${StrUtil.isNull(this.inputStr)}`);this.addLog(`isNull(null) →${StrUtil.isNull(null)}`);this.addLog(`isNull(undefined) →${StrUtil.isNull(undefined)}`);

实际运行结果

  • isNull(" Hello HarmonyOS ")false(有值,不是 null)
  • isNull(null)true(就是 null)
  • isNull(undefined)true(undefined 也算)

对应的isNotNull就是取反,传进去不是 null/undefined 就返回 true。

this.addLog(`isNotNull("${this.inputStr}") →${StrUtil.isNotNull(this.inputStr)}`);

isEmpty:判断"有没有内容"

isEmptyisNull严格一点,它不只检查 null,还检查字符串是否为空字符串""

但注意,isEmpty不处理空白字符。你传一个全是空格的字符串" ",它也会返回false,因为那个字符串有内容(虽然是空格)。

this.addLog(`isEmpty("${this.inputStr}") →${StrUtil.isEmpty(this.inputStr)}`);this.addLog(`isEmpty("") →${StrUtil.isEmpty('')}`);

实际运行结果

  • isEmpty(" Hello HarmonyOS ")false(有内容)
  • isEmpty("")true(空字符串)
  • isEmpty(null)→ 很多实现里也返回true,因为没有内容

对应的isNotEmpty就是非空才返回 true:

this.addLog(`isNotEmpty("${this.inputStr}") →${StrUtil.isNotEmpty(this.inputStr)}`);

isBlank:最严格的那个,连空格也不放过

isBlank是三兄弟里最"挑剔"的。它不只检查 null 和空字符串,还会检查字符串是否全为空白字符(空格、制表符等)。

this.addLog(`isBlank("${this.inputStr}") →${StrUtil.isBlank(this.inputStr)}`);this.addLog(`isBlank(" ") →${StrUtil.isBlank(' ')}`);

实际运行结果

  • isBlank(" Hello HarmonyOS ")false(虽然有空格,但有实际内容)
  • isBlank(" ")true(全是空格,当空白处理)
  • isBlank("")true
  • isBlank(null)true

对应的isNotBlank就是真正有可见内容才返回 true:

this.addLog(`isNotBlank("${this.inputStr}") →${StrUtil.isNotBlank(this.inputStr)}`);

三个方法的对比一览

场景isNullisEmptyisBlank
null✅ true✅ true✅ true
undefined✅ true✅ true✅ true
""空字符串❌ false✅ true✅ true
" "纯空格❌ false❌ false✅ true
"hello"正常字符串❌ false❌ false❌ false

什么场景用哪个?

isNull:你只想区分"有没有传参",null 和 undefined 需要特殊处理,但空字符串是合法值的场景。比如接口返回值检查。

isEmpty:你需要确保字符串有内容,但空白字符对你来说也有意义的场景。比如密码字段——密码是空格也算有输入。

isBlank:表单验证场景。用户只输入了空格,你肯定想拦截,这时候用isBlank最合适。比如用户名输入框、搜索框。

完整 Demo 代码

完整的 Demo 页面代码如下,可以直接在 HarmonyOS 项目中运行:

importrouterfrom'@ohos.router';import{StrUtil}from'../Utils/StrUtil';interfaceLogItem{time:string;text:string;}@Entry@Componentstruct StrUtilDemoPage{@Statelogs:LogItem[]=[];@StateinputStr:string=' Hello HarmonyOS ';privateaddLog(text:string){constd=newDate();consttime=`${d.getHours().toString().padStart(2,'0')}:${d.getMinutes().toString().padStart(2,'0')}:${d.getSeconds().toString().padStart(2,'0')}`;constnewItem:LogItem={time,text};this.logs=([newItem]asLogItem[]).concat(this.logs).slice(0,60);}build(){Column(){// isNull / isNotNullButton('isNull(null)').onClick(()=>{this.addLog(`isNull(null) →${StrUtil.isNull(null)}`);})Button('isNull(undefined)').onClick(()=>{this.addLog(`isNull(undefined) →${StrUtil.isNull(undefined)}`);})Button('isEmpty("")').onClick(()=>{this.addLog(`isEmpty("") →${StrUtil.isEmpty('')}`);})Button('isBlank(" ") 全空格').onClick(()=>{this.addLog(`isBlank(" ") →${StrUtil.isBlank(' ')}`);})Button('isNotBlank("hello")').onClick(()=>{this.addLog(`isNotBlank("hello") →${StrUtil.isNotBlank('hello')}`);})}}}

写在最后

这三个方法说起来简单,但真正搞清楚差别能帮你少踩很多坑。

最常见的错误就是在表单验证里用了isEmpty,结果用户输入一串空格也通过了检查。改成isBlank就能正确拦截。

下一篇我们聊trimtrimAll——去空格也有讲究。

http://www.jsqmd.com/news/916050/

相关文章:

  • 深度拆解:KTV如何用“免费送酒“策略撬动370万投资
  • 为什么Sunshine游戏串流服务器能让你的游戏体验提升300%?终极跨平台游戏流媒体完整指南
  • 从客户分群到异常检测:轮廓系数在实际业务场景中的高级用法与避坑指南
  • PolicyBank:让LLM智能体从错误中进化,精准理解业务规则
  • claude-code命令之使用国产大模型教程
  • 从零上手Juniper SRX300防火墙:手把手配置DHCP、NTP和Web管理(含安全策略)
  • UWB高精度测距实战:基于RYUW122_Lite模块的AT命令快速上手
  • 验收驱动提示词:让企业 AI 输出可控、可复用
  • 子查询入门|标量 / 行 / 列子查询,简化复杂查询
  • 预订劫持钓鱼风暴深度解析:350家酒店沦陷背后的数据武器化与AI攻击革命
  • HBase Java API实战:从Shell到代码,手把手教你完成增删改查(附完整项目源码)
  • 隐私至上:本地化Cookie导出工具Get cookies.txt LOCALLY完全指南
  • 仿真科普 | 低空经济的“数字风盾”:CFD+数字孪生构建智慧风场仿真体系
  • 别再只盯着路由模式了!天融信防火墙透明模式部署实战,零感知保护内网安全
  • Java 程序员第 40 阶段05:从零搭建 Java 大模型完整项目,接口层设计与API开发
  • HarmonyOS StrUtil 字符串处理实战:trim 去空格、replace 替换、大小写转换全攻略
  • 安川焊接机器人保护气智能节气阀
  • 不只是apt install:手把手教你从官方快照源为Debian 9/10/11安装特定旧版内核
  • GIST框架:基于语义拓扑的轻量化室内空间感知与导航实践
  • 从规则引擎到情境感知:构建个性化内容治理系统的技术实践
  • 如何用SMUDebugTool深度掌控你的AMD Ryzen处理器:新手快速入门指南
  • 别再傻傻分不清了!TPM、TCM、TPCM,这些电脑里的“安全卫士”到底有啥区别?
  • 网易云音乐双语歌词下载终极指南:LrcHelper带你轻松获取完美歌词
  • 深度解析:如何通过本地化处理彻底解决Cookie安全风险
  • Quick 自定义应用实战:不写代码,用自然语言搭一个内部数据看板
  • 智慧树刷课插件终极指南:3分钟解放你的学习时间![特殊字符]
  • 当测试对象变成大模型:AI 测试与传统软件测试的 8 个核心差异
  • 神经渲染相机轨迹优化:从理论到实战的完整指南
  • 加密市场HODL投资哲学:构建信念体系应对波动,实现长期价值增长
  • 2026年商务出行,哪家口碑好的品牌能成为你的不二之选?