网站首页 > 技术文章 正文
我在使用
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<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()比较时间戳
@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对象。
// 存入AppStorage
AppStorage.setOrCreate('lastLogin', new Date().getTime());
// 读取并转换为Date
const timestamp = AppStorage.get<number>('lastLogin');
const lastLogin = new Date(timestamp);
需要注意:仅适用于简单的Date对象,若对象包含其他的属性可能失效。性能较低,频繁操作可能会影响渲染。
大家可以按照自己的需要选择适合的方式即可。
猜你喜欢
- 2025-07-09 哈佛大学搞出声波传数据芯片,抗干扰能力更强,适用于量子计算等
- 2025-07-09 手把手教你搭建消防安全答题小程序-实现答题及提交答卷到数据库
- 2025-07-09 CBN丨China extends visa-free transit stays to 240 hours
- 2025-07-09 经常做噩梦,究竟意味着什么?(经常做噩梦有什么说法吗)
- 2025-07-09 APICloud 多端开发教程 |《企业展示》源码深度解析
- 2025-07-09 头条小程序《音乐画板》开发手记(4):提审结果与音乐库的开发
- 2025-07-09 定了!总台元宵晚会还有重庆,看到这些元素千万别眨眼
- 2025-07-09 重庆瞭望|别小看这7分钟(我想看重庆)
- 2024-08-03 什么样的女生一看就知道没谈过恋爱?网友评论:受益匪浅
- 2024-08-03 uni-app实现图片上传组件(uniapp多张图片上传)
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 533℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 496℃MySQL service启动脚本浅析(r12笔记第59天)
- 475℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 473℃启用MySQL查询缓存(mysql8.0查询缓存)
- 453℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 432℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 430℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)