HarmonyOS StrUtil 字符串比较全攻略:equal、notEqual 与 toStr 安全转换详解
文章目录背景方法总览equal / notEqual字符串比较为什么不直接用 toStr安全的类型转换toStr 解决了什么痛点repeat字符串重复startsWith / endsWith 补充说明StrUtil 方法全量速查表写在最后背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓这篇聚焦StrUtil里几个容易被忽视但很实用的方法equal、notEqual比较toStr安全类型转换以及repeat字符串重复。单独拿出来讲因为里面有些细节值得深挖。方法总览equal / notEqual字符串比较equal(a, b)判断两个值是否相等notEqual(a, b)判断是否不相等this.Btn(equal(abc,abc),#884EA0,(){this.addLog(equal(abc,abc) →${StrUtil.equal(abc,abc)});})this.Btn(equal(abc,ABC),#884EA0,(){this.addLog(equal(abc,ABC) →${StrUtil.equal(abc,ABC)});})this.Btn(notEqual(1, 2),#76448A,(){this.addLog(notEqual(1, 2) →${StrUtil.notEqual(1,2)});})实际运行结果equal(abc,abc)→trueequal(abc,ABC)→false大小写敏感notEqual(1, 2)→true为什么不直接用 这是个好问题。既然有为什么还要用equal主要原因有两个1. 支持非字符串类型从 Demo 里可以看到notEqual(1, 2)传的是数字不是字符串。equal方法做的是宽泛的等值判断不只是字符串。这在某些场景下比更灵活。2. 代码可读性// 用 判断if(statusactiveroleadmin){...}// 用 equal 更语义化在某些代码风格里更清晰if(StrUtil.equal(status,active)StrUtil.equal(role,admin)){...}对于大多数场景就够用了。equal更多是一种风格选择也方便统一处理空值边界情况不同实现里可能对 null 的处理不同。toStr安全的类型转换toStr(value, defaultValue?)把任何值转成字符串可以设置默认值this.Btn(toStr(null) → 默认空串,#F39C12,(){this.addLog(toStr(null) → ${StrUtil.toStr(null)});})this.Btn(toStr(123),#F39C12,(){this.addLog(toStr(123) → ${StrUtil.toStr(123)});})this.Btn(toStr(true),#F39C12,(){this.addLog(toStr(true) → ${StrUtil.toStr(true)});})this.Btn(toStr(undefined, N/A),#F39C12,(){this.addLog(toStr(undefined,N/A) → ${StrUtil.toStr(undefined,N/A)});})实际运行结果toStr(null)→null 转为空字符串toStr(123)→123toStr(true)→truetoStr(undefined, N/A)→N/Aundefined 时用默认值toStr 解决了什么痛点直接用.toString()在遇到 null/undefined 时会报错constvalue:string|nullnull;// ❌ 报错Cannot read properties of null (reading toString)conststrvalue.toString();// ❌ 也不够简洁conststrvalue!nullvalue!undefined?value.toString():;// ✅ 用 toStr简洁安全conststrStrUtil.toStr(value);// ✅ 带默认值conststrStrUtil.toStr(value,未知);在渲染列表数据时特别常用接口返回的数据字段可能是 null直接显示之前转一下// 接口返回的用户数据interfaceUserInfo{name:string|null;phone:string|undefined;age:number;}// 渲染时安全转换Text(StrUtil.toStr(user.name,未知用户))Text(StrUtil.toStr(user.phone,未绑定手机))Text(StrUtil.toStr(user.age))repeat字符串重复repeat(str, n)把字符串重复 n 次this.Btn(repeat(Ha,${this.inputRepeat}),#2471A3,(){constvStrUtil.repeat(Ha,this.inputRepeat);this.addLog(repeat(Ha,${this.inputRepeat}) → ${v});})Demo 里有个输入框可以设置重复次数Row({space:8}){Text(次数:).fontSize(13).fontColor(#666)TextInput({text:this.inputRepeat.toString()}).layoutWeight(1).height(38).fontSize(13).type(InputType.Number).onChange(v{this.inputRepeatparseInt(v)||1;})}实际运行结果repeat(Ha, 3)→HaHaHarepeat(*, 10)→**********使用场景生成分隔线repeat(-, 40)→----------------------------------------生成填充字符串repeat(0, 5)→00000UI 中的占位星号repeat(*, password.length)startsWith / endsWith 补充说明这两个方法在上一篇简单提过这里补充一个实际场景// 判断链接类型consturlhttps://example.com/api/data;if(StrUtil.startsWith(url,https://)){console.log(安全链接);}elseif(StrUtil.startsWith(url,http://)){console.log(非加密链接);}// 判断文件类型constfilenamereport.pdf;if(StrUtil.endsWith(filename,.pdf)){openPDFViewer(filename);}elseif(StrUtil.endsWith(filename,.docx)){openWordViewer(filename);}StrUtil 方法全量速查表方法功能返回值isNull(v)是否为 null/undefinedbooleanisNotNull(v)是否不为 null/undefinedbooleanisEmpty(v)是否为空字符串/nullbooleanisNotEmpty(v)是否非空booleanisBlank(v)是否为空白含全空格booleanisNotBlank(v)是否非空白booleantrim(str)去两端空格stringtrimAll(str)去所有空格stringtoStr(v, default?)安全转字符串stringreplace(str, pattern, rep)替换第一个匹配stringreplaceAll(str, pattern, rep)替换所有匹配stringstartsWith(str, prefix)是否以指定前缀开头booleanendsWith(str, suffix)是否以指定后缀结尾booleanrepeat(str, n)重复字符串stringtoLower(str)转全小写stringtoUpper(str)转全大写stringcapitalize(str)首字母大写其余小写stringequal(a, b)是否相等booleannotEqual(a, b)是否不相等booleanstrToUint8Array(str)字符串→Uint8ArrayUint8Arrayunit8ArrayToStr(arr)Uint8Array→字符串stringstrToBase64(str)字符串→Base64stringbase64ToStr(b64)Base64→字符串stringstrToBuffer(str)字符串→ArrayBufferArrayBufferbufferToStr(buf)ArrayBuffer→字符串stringstrToHex(hex)Hex字符串→Uint8ArrayUint8ArrayhexToStr(arr)Uint8Array→Hex字符串stringstrToBytes(str)字符串→Uint8ArrayUint8ArraybytesToStr(arr)Uint8Array→字符串stringgetErrnoToString(code)错误码→错误描述string写在最后toStr是防御性编程的好帮手在接口数据不确定类型时用它比裸写.toString()安全很多。equal和notEqual在强调语义化的代码里也很有用。至此StrUtil 的所有核心方法都覆盖了。掌握这些方法字符串处理就没什么难的了。