当前位置: 首页 > 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.zskr.cn/news/1427363.html

相关文章:

  • 为什么Sunshine游戏串流服务器能让你的游戏体验提升300%?终极跨平台游戏流媒体完整指南
  • PolicyBank:让LLM智能体从错误中进化,精准理解业务规则
  • claude-code命令之使用国产大模型教程
  • 子查询入门|标量 / 行 / 列子查询,简化复杂查询
  • 预订劫持钓鱼风暴深度解析:350家酒店沦陷背后的数据武器化与AI攻击革命
  • 隐私至上:本地化Cookie导出工具Get cookies.txt LOCALLY完全指南
  • Java 程序员第 40 阶段05:从零搭建 Java 大模型完整项目,接口层设计与API开发
  • HarmonyOS StrUtil 字符串处理实战:trim 去空格、replace 替换、大小写转换全攻略
  • 安川焊接机器人保护气智能节气阀
  • 不只是apt install:手把手教你从官方快照源为Debian 9/10/11安装特定旧版内核
  • GIST框架:基于语义拓扑的轻量化室内空间感知与导航实践
  • 别再傻傻分不清了!TPM、TCM、TPCM,这些电脑里的“安全卫士”到底有啥区别?
  • 当测试对象变成大模型:AI 测试与传统软件测试的 8 个核心差异
  • 通知怎么写② | 工作部署通知结构解析与模板
  • 2026西安卫生间瓷砖漏水不砸砖维修公司优选排行 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 冠盾建筑修缮
  • Java 异常 - 基础
  • 从屏幕涂鸦到专业演示:ppInk如何重新定义你的数字表达方式
  • MyTV-Android:老旧电视重获新生的终极直播解决方案
  • 如何测试一个 Agent 智能体?工具调用准确率与任务规划能力的评估
  • nAFDM技术:提升高速移动通信频谱效率的创新方案
  • 5分钟快速掌握SMUDebugTool:免费开源AMD Ryzen硬件调试终极指南
  • Claude Code 深度使用40小时复盘:把AI当成你的复利账户
  • 2026年VMware替代趋势观察:国产虚拟化软件云宏CNware的平滑迁移方案
  • W4A8量化技术与LiquidGEMM优化实践
  • Claude商业分析报告失效的最后72小时:当客户流失预测置信度骤降超18%,这4个信号必须立刻干预(实时监控SOP已上线)
  • Lovable区块链平台性能瓶颈突破:5个被90%团队忽略的共识层优化关键点
  • 终极PUBG压枪宏配置指南:5步实现完美无后坐力射击
  • 给程序员的气象学:用代码思维图解大气环流三圈模型(哈德来/费雷尔/极地环流)
  • 打造个人云游戏服务器:Sunshine终极配置实战指南
  • AI 系统的“黄金数据集”:为什么构建高质量的评测集比写自动化还难?