鸿蒙NEXT-Data类型数据通过AppStore获取后找原本一样的数据(值一样)但是比较结果却为false
我在使用
dataTime.indexOf(Time) 来在Date[]数组里面找一个存在的相同的数据, 发现即使我明确知道该dataTiem中有和Time一样的Data属性的值, 但是却获得了-1,比较结果为false。
分析错误原因:
引用比较机制 Date是复杂数据类型(对象),在JavaScript/ArkTS中直接使用 === 或 indexOf 比较时,比较的是对象的内存地址而非实际值。 例如:从AppStorage获取的Date对象与原始对象即使时间戳相同,也可能是不同实例,导致indexOf返回-1。用大白话来说就是Date[]复杂数据类型,在比较时,会比较他们的地址是否相同,而不会去比较他们的值,本质是对象引用比较与值比较的差异导致的,那我们该如何去实现呢?去比较他们的值,获取我们预期的结果。
示例代码如下:
方式一:使用JSON
@Entry @Component struct Index { @State dataTime: Array = [] @State Time: Date = new Date() aboutToAppear(): void { this.dataTime.forEach((item)=>{ console.log(''+Boolean(JSON.stringify(item)===JSON.stringify(this.Time))) }) } build() {
} }
使用JSON.stringify()比较Date对象,即序列化后的字符串进行比较
方式二:使用原本提供的方法来比较,即使用getTime()比较时间戳
@Entry @Component struct Index { @State dataTime: Array = [] @State Time: Date = new Date() aboutToAppear(): void { this.dataTime.forEach((item)=>{ console.log(Boolean(item.getTime()=== this.Time.getTime())+'') }) } build() {
} }
直接比较时间戳(数值类型),避免引用问题。性能高效,无需转换数据类型。
方式三:存储优化
持久化Date类型时,统一存储时间戳(number)而非Date对象。
// 存入AppStorage AppStorage.setOrCreate('lastLogin', new Date().getTime());
// 读取并转换为Date const timestamp = AppStorage.get('lastLogin'); const lastLogin = new Date(timestamp);
需要注意:仅适用于简单的Date对象,若对象包含其他的属性可能失效。性能较低,频繁操作可能会影响渲染。
大家可以按照自己的需要选择适合的方式即可。
- 0回答
- 0粉丝
- 0关注
- Ark-TS:鸿蒙开发的 “万能钥匙”,让跨设备开发像搭积木一样简单
- 鸿蒙开发:ArkTs数据类型
- HarmonyOS NEXT跨多个组件之间如何进行数据通信?
- 【HarmonyOS NEXT】ArkTs数据类型解析与使用
- harmony OS NEXT-通过用户首选项实现数据持久化
- HarmonyOS实战:一招解决等待多个并发结果
- 【HarmonyOS NEXT】Web 组件的基础用法以及 H5 侧与原生侧的双向数据通讯
- OpenHarmony应用:货币兑换数据获取与显示
- 鸿蒙Next解决子组件全屏后margin不生效
- 【HarmonyOS NEXT】鸿蒙获取appIdentifier,Identifier
- 101.HarmonyOS NEXT跑马灯组件教程:数据源与数据类型详解
- 【HarmonyOS NEXT】鸿蒙应用地理位置获取,地理名称获取
- 鸿蒙开发中父子组件如何进行数据通信(状态管理v1版)?
- 110.HarmonyOS NEXT 跑马灯组件数据类型详解:理解数据结构
- 鸿蒙开发:如何解决软键盘弹出后的间距