localstorage键名无固定排序,遍历依赖插入顺序且不跨浏览器一致;唯一标准方式是用length配合key(i)获取键名,再getitem取值;object.keys和for...in等方法不可靠。

localStorage 中的键名没有固定排序规则,遍历顺序取决于插入顺序,但不保证跨浏览器一致;遍历必须用 key(index) 配合 length,没有原生的 keys() 方法。
键名顺序由插入决定,不是字典序
localStorage 不对键名做字母或数值排序。你第一次调用 setItem('z', '1'),第二次调用 setItem('a', '2'),那么 key(0) 返回 'z',key(1) 返回 'a'。这个顺序是浏览器按写入时间维护的,主流浏览器(Chrome、Firefox、Edge)通常遵循插入顺序,但规范未强制要求,因此不能依赖它做逻辑判断或 UI 排序。
标准遍历方式:用 length + key(i)
这是唯一符合规范、全浏览器兼容的做法:
-
localStorage.length给出当前存储的键值对总数 -
localStorage.key(i)(i 从 0 到length - 1)返回第 i 个插入的键名 - 拿到键名后,再用
localStorage.getItem(key)获取对应值
示例代码:
const keys = [];<br>for (let i = 0; i const key = localStorage.key(i);<br> if (key && key.startsWith('file-')) { // 可加筛选条件<br> keys.push({ key, value: localStorage.getItem(key) });<br> }<br>}现代简洁写法:Array.from 构建键名数组
避免手动写 for 循环,可用 Array.from 生成索引序列并映射为键名:
const allKeys = Array.from(<br> { length: localStorage.length },<br> (_, i) => localStorage.key(i)<br>);如果还需同时获取值,可进一步处理:
const entries = Array.from(<br> { length: localStorage.length },<br> (_, i) => {<br> const key = localStorage.key(i);<br> return [key, localStorage.getItem(key)];<br> }<br>);这些方法不可靠,别用
以下方式看似方便,但存在严重问题,生产环境禁止使用:
-
Object.keys(localStorage):localStorage 是宿主对象,非普通 JS 对象,该调用结果不可预测(Chrome 可能返回空数组,Firefox 常报错) -
for...in循环:会遍历原型上的方法(如setItem、getItem),混入非数据属性 - 假设键名按字母序排列后遍历:规范未定义排序,行为不跨浏览器稳定











