localStorage使用不止于getItem、setItem、removeItem

今天我们来聊聊js内置对象localStorage的使用,我们平时一般都是getItem、setItem和removeItem,很少接触其他的。

javascript 复制代码
localStorage.getItem('info')
localStorage.setItem('info', '123')
localStorage.remoItem('info')

某天,突然有个小需求,需要我们清除local中所有以user_开头的数据,怎么办呢?显然光用getItem和removeItem是无法实现的。

那么,我们先来学习几个获取 localStorage 中所有缓存的 key的方法:

方法一:使用 for 循环

javascript 复制代码
function getAllLocalStorageKeys() {
  const keys = []
  for (let i = 0; i < localStorage.length; i++) {
    const key = localStorage.key(i)
    keys.push(key)
  }
  return keys
}

// 使用
const allKeys = getAllLocalStorageKeys()
console.log(allKeys)

方法二:使用扩展运算符和 map

javascript 复制代码
const keys = [...Array(localStorage.length)].map((_, i) => localStorage.key(i))
console.log(keys)

方法三:获取键值对

如果你想同时获取键和对应的值:

javascript 复制代码
function getAllLocalStorageItems() {
  const items = {}
  for (let i = 0; i < localStorage.length; i++) {
    const key = localStorage.key(i)
    const value = localStorage.getItem(key)
    items[key] = value
  }
  return items
}

// 使用
const allItems = getAllLocalStorageItems()
console.log(allItems)

方法四:使用 Object.keys 的替代方法

javascript 复制代码
const keys = Object.keys(localStorage)
console.log(keys)  // 这会返回所有 localStorage 的 key

方法五:封装成实用函数

javascript 复制代码
class LocalStorageHelper {
  static getAllKeys() {
    return Object.keys(localStorage)
  }
  
  static getAllItems() {
    return Object.keys(localStorage).reduce((obj, key) => {
      obj[key] = localStorage.getItem(key)
      return obj
    }, {})
  }
  
  static getKeysByPrefix(prefix) {
    return Object.keys(localStorage).filter(key => key.startsWith(prefix))
  }
}

// 使用
const allKeys = LocalStorageHelper.getAllKeys()
const allItems = LocalStorageHelper.getAllItems()

示例:统计存储情况

javascript 复制代码
function analyzeLocalStorage() {
  const keys = Object.keys(localStorage)
  const totalSize = keys.reduce((total, key) => {
    return total + (localStorage.getItem(key).length || 0)
  }, 0)
  
  console.log(`总条目数: ${keys.length}`)
  console.log(`总大小: ${totalSize} 字符`)
  console.log(`所有键名:`, keys)
  
  return {
    count: keys.length,
    totalSize: totalSize,
    keys: keys
  }
}

analyzeLocalStorage()

推荐使用 方法一 或 方法四,它们简单直接且兼容性好。

知道了这些方法后,清除local中所有以user_开头的数据这个需求就很简单了。

javascript 复制代码
	Object.keys(localStorage).forEach(key => {
		if (key.startsWith('user_')) {
       localStorage.removeItem(key)
     }	
	})

最后,localStorage相关限制,我相信大家肯定也是了解的:

  1. 同源策略:localStorage 受同源策略限制,只能访问当前域名下的存储
  2. 数据类型:获取的 key 都是字符串类型
  3. 存储限制:每个域名的 localStorage 通常有 5MB 左右的存储限制
  4. 空值处理:如果 localStorage 为空,这些方法会返回空数组或空对象
相关推荐
Lsx_1 小时前
微信支付接入全流程:JSAPI支付、小程序支付与H5支付
前端·javascript·全栈
OpenTiny社区1 小时前
React 正式登场!GenUI SDK v1.4.0 三框架渲染、出码与 Agent 生态重磅升级~
前端·ai编程
试图让你心动1 小时前
【无标题】
前端·javascript·vue.js
Hilaku1 小时前
为什么每个前端都应该拥有一个自己的独立博客?
前端·javascript·程序员
燕落南枝2 小时前
CSS 后代选择器与子代选择器:从入门到实战
前端·css
Amos_Web2 小时前
Rspack 源码解析(二十八):HtmlRspackPlugin 如何把模板变成带资源标签的最终产物
前端
马可家的菠萝2 小时前
个人知识库怎么建?从一个正在学的技术主题开始
前端·笔记·知识管理·个人知识库
几何心凉2 小时前
端到端具身交互智能正式上线:让 AI 通过屏幕和机器人,真正走进现实世界
前端·人工智能·实时互动·机器人·交互
木圭的AI时代指南2 小时前
实测 MiniMax M3.1 Flash:同一道 Three.js 大题,两个 agent 差出 4.6 倍
开发语言·javascript·ecmascript
西红柿炖牛腩3542 小时前
3D 模型压缩脚本又报错又配环境?换个不用维护的方案
javascript·3d·性能优化