首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙NEXT-Data类型数据通过AppStore获取后找原本一样的数据(值一样)但是比较结果却为false

鸿蒙NEXT-Data类型数据通过AppStore获取后找原本一样的数据(值一样)但是比较结果却为false

原创
作者头像
用户11718959
修改2025-07-03 20:54:20
修改2025-07-03 20:54:20
10700
代码可运行
举报
文章被收录于专栏:鸿蒙开发鸿蒙开发
运行总次数:0
代码可运行

我在使用

代码语言:javascript
代码运行次数:0
运行
复制
dataTime.indexOf(Time)
来在Date[]数组里面找一个存在的相同的数据,
发现即使我明确知道该dataTiem中有和Time一样的Data属性的值,
但是却获得了-1,比较结果为false。

分析错误原因:

引用比较机制 Date是复杂数据类型(对象),在JavaScript/ArkTS中直接使用 === 或 indexOf 比较时,比较的是对象的内存地址而非实际值。 例如:从AppStorage获取的Date对象与原始对象即使时间戳相同,也可能是不同实例,导致indexOf返回-1。用大白话来说就是Date[]复杂数据类型,在比较时,会比较他们的地址是否相同,而不会去比较他们的值,本质是对象引用比较与值比较的差异导致的,那我们该如何去实现呢?去比较他们的值,获取我们预期的结果。

示例代码如下:

方式一:使用JSON

代码语言:javascript
代码运行次数:0
运行
复制
@Entry
@Component
struct Index {
  @State dataTime: Array<Date> = []
  @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()比较时间戳

代码语言:javascript
代码运行次数:0
运行
复制
@Entry
@Component
struct Index {
  @State dataTime: Array<Date> = []
  @State Time: Date = new Date()
  aboutToAppear(): void {
    this.dataTime.forEach((item)=>{
      console.log(Boolean(item.getTime()=== this.Time.getTime())+'')
    })
  }
  build() {
    
  }
}

直接比较时间戳(数值类型),避免引用问题。性能高效,无需转换数据类型。

方式三:存储优化

持久化Date类型时,统一存储时间戳(number)而非Date对象。

代码语言:javascript
代码运行次数:0
运行
复制
// 存入AppStorage
AppStorage.setOrCreate('lastLogin', new Date().getTime());

// 读取并转换为Date
const timestamp = AppStorage.get<number>('lastLogin');
const lastLogin = new Date(timestamp);

需要注意:仅适用于简单的Date对象,若对象包含其他的属性可能失效。性能较低,频繁操作可能会影响渲染。

大家可以按照自己的需要选择适合的方式即可。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档