LocalStorage存储合并数组不生效,退出站点后数组重置为初始值问题求助
问题根源
- setTimeout的延迟参数设置为
1500000000000000毫秒,换算后约为4756万年,页面运行后根本不会触发回调内的逻辑,合并、存储、读取操作从未执行 - 数组初始化逻辑顺序错误:每次进入页面
arr1初始值为空,你优先判断为空就赋值初始数组[1,2,3,4,5],不会优先读取LocalStorage存储的旧值,导致存储的结果永远被初始值覆盖 Storage原型的扩展方法写在定时器回调内部,第一次调用getObj时方法还未挂载,会直接抛出未定义错误- 读取LocalStorage时没有做空值兜底,如果存储项不存在
getObj会返回null,后续调用数组方法indexOf、concat都会报错
修复后的完整代码
// 先全局扩展Storage方法,避免调用时未定义 Storage.prototype.setObj = function(key, obj) { return this.setItem(key, JSON.stringify(obj)) } Storage.prototype.getObj = function(key) { return JSON.parse(this.getItem(key)) } let arr1 = [] // 初始化优先读LocalStorage,读不到再用初始值 const localArr = localStorage.getObj("StoreArrToken") arr1 = localArr && Array.isArray(localArr) ? localArr : [1,2,3,4,5] // 移除无意义的超长延迟setTimeout,直接启动定时任务 setInterval(myTimer, 5000) function myTimer() { let arr2 = [6, 8, 10] // 筛选arr2中不在arr1里的非重复元素 const noDuplicate = arr2.filter(val => !arr1.includes(val)) if (noDuplicate.length === 0) { console.log("无新增非重复元素") } else { arr1 = arr1.concat(noDuplicate) console.log("合并后的数组:", arr1) // 存储更新后的数组 localStorage.setObj("StoreArrToken", arr1) } }
核心修改说明
- 将Storage原型方法扩展提到代码最顶部,全局可用
- 初始化阶段优先读取LocalStorage存储值,仅当存储值不存在时才使用初始数组
- 移除了超长延迟的setTimeout,确保定时合并逻辑正常触发
- 增加了LocalStorage读取结果的合法性校验,避免空值报错
内容的提问来源于stack exchange,提问作者PHONG VE XUAN BINH
相关产品推荐
相关产品推荐

