• 精通LocalStorage必须知道的5个“黑料”
  • 发布于 1周前
  • 45 热度
    0 评论
  • Pigeon
  • 1 粉丝 42 篇博客
  •   
提到 LocalStorage,你是不是觉得它就像个老实巴交的工具人?一个随叫随到、任劳任怨的浏览器仓库管理员?我们天天用它存点数据,感觉熟悉得就像左手摸右手。但说真的,你这位“老朋友”,其实藏着不少秘密。它有些怪癖,有些“黑料”,你要是不知道,关键时刻它就能给你来个背刺,让你加班到夜深人静,对着电脑屏幕怀疑人生。今天,我就来当一回“扒皮先锋”,揭露 LocalStorage 的 5 个惊天“黑料”,带你看看它不为人知的一面。

黑料一:它是个“路霸”,一人干活,全家罚站
你可能觉得 localStorage.setItem('key', 'value') 这行代码快如闪电,但真相是,它是个不折不扣的“路霸”!LocalStorage 的所有操作都是同步的。这是什么概念?打个比方,你的代码是条繁华的单行道(浏览器的主线程),各种车辆(渲染、动画、用户交互)都在有序通行。突然,localStorage 这辆大卡车要停车卸货(读写数据)。它不管三七二十一,直接把路一横,大喊一声:“都别动,等我搞完!”

于是,整条路都堵死了。动画卡住了,页面点击没反应了,用户以为电脑死机了。虽然对于小数据,这个过程快到你感觉不到,但如果你尝试存入一个稍微大点的 JSON 字符串,那画面的卡顿感,绝对酸爽。
// 堆代码 duidaima.com
// 想象一下,如果这个 aBigObject 序列化后有几MB大
// 当执行这行代码时,你的页面可能会瞬间“冻结”
try {
  localStorage.setItem('massiveData', JSON.stringify(aBigObject));
} catch (e) {
  console.error("哎呀,仓库满了,放不下了!", e);
}
避坑指南: 别用它来存储需要频繁更新或体积庞大的数据。对于那些大家伙,请把它们交给异步的 IndexedDB 或者干脆交给后端。

黑料二:它是个“大嘴巴”,能跨窗口“隔空喊话”
你以为每个浏览器标签页都是一座孤岛?LocalStorage 告诉你:天真了!它其实是个隐藏的“情报大师”。当你在一个页面(比如 a.com/page1)修改了 localStorage,所有同源(也就是同一个网站 a.com 下)的其他页面,都能立刻收到“风声”。这个“隔空喊话”的功能,是通过 storage 事件实现的。
// 在你的另一个同源标签页里监听
window.addEventListener('storage', (event) => {
  console.log('隔壁老王家好像有动静了!');
  console.log(`键:${event.key}`);
  console.log(`旧值:${event.oldValue}`);
  console.log(`新值:${event.newValue}`);
  console.log(`搞事情的页面:${event.url}`);
});
这个特性酷毙了!你可以用它来实现多标签页之间的状态同步。比如,用户在一个页面登录后,其他打开的页面可以自动“刷新”成登录状态;在一个页面把商品加入购物车,其他页面的购物车图标也能实时更新。是不是瞬间感觉格局打开了?

黑料三:它是个“偏食怪”,只吃字符串
这是新手最容易踩的坑,没有之一。LocalStorage 表面上看起来什么都能存,但它的胃口极其挑剔,只认一样东西——字符串。你兴高采烈地丢给它一个对象:
const user = { name: '堆代码', level: 99 };
localStorage.setItem('userInfo', user);
然后你去取:
const info = localStorage.getItem('userInfo');
console.log(info); // 输出啥? " [object Object] "
console.log(info.name); // undefined,直接报错!
你的对象被它无情地转换成了呆板的 "[object Object]" 字符串,所有信息都丢失了。正确喂食方法: 在存入前,先用 JSON.stringify() 把它变成“JSON味”的字符串;在取出后,再用 JSON.parse() 给它“复原”。
// 存入:先打成字符串
localStorage.setItem('userInfo', JSON.stringify(user));
// 取出:再变回对象
const userObject = JSON.parse(localStorage.getItem('userInfo'));
console.log(userObject.name); // "堆代码",这回对了!
黑料四:它的“豪宅”其实只有 5MB
LocalStorage 经常被我们想象成一个无限大的仓库,但实际上,它只是个“经济适用房”,大多数浏览器的实现都把它的大小限制在 5MB 左右。你可能觉得 5MB 很大了,但如果你不停地往里面塞图片(的Base64编码)、日志、或者各种缓存数据,总有一天,它会冷酷地向你抛出一个 QuotaExceededError 异常,告诉你:“地主家也没有余粮了!”

避坑指南: 对 localStorage 的使用要有所节制,把它当成寸土寸金的宝地。定期清理无用数据,并且在执行 setItem 时,最好用 try...catch 包裹起来,优雅地处理可能出现的“爆仓”异常。

黑料五:它从不锁门,谁都能“入室盗窃”
这是最致命、最需要警惕的“黑料”!LocalStorage 的安全性,约等于裸奔。它就像一个从不上锁的抽屉,任何运行在你页面上的 JavaScript 代码都能轻松翻阅其中的所有内容。这意味着,如果你的网站遭受了 XSS(跨站脚本攻击),攻击者注入的一小段恶意脚本,就能把你的 localStorage 翻个底朝天。如果你把用户的登录凭证(比如 JWT Token)这种敏感信息存在这里,那就等于把家门钥匙挂在了门外,欢迎各路黑客前来“做客”。
// 任何在页面上运行的JS都能执行这行代码
const userToken = localStorage.getItem('user_token');
// 然后就可以把 token 发送到攻击者的服务器了...
// (此处省略恶意代码)
安全第一: 永远、永远、永远不要在 LocalStorage 中存储任何敏感数据!比如密码、Token、个人身份信息等。对于这类数据,请使用更安全的 HttpOnly Cookies,它能有效防止被 JavaScript 读取,从而抵御 XSS 攻击。

总结 
好了,LocalStorage 的五大“黑料”就扒到这里。它不是那个任劳任怨的傻白甜,而是一个性格鲜明、优缺点共存的强大工具。它会“堵路”,但也能“隔空喊话”;它很“偏食”,但“豪宅”容量有限;最重要的是,它“从不锁门”。真正的高手,不是因为他知道的工具多,而是因为他对自己手中的每一个工具都了如指掌,知道它的脾气,善用它的优点,规避它的缺陷。

希望这次的“爆料”,能让你对 LocalStorage 有一个全新的、更深刻的认识。
用户评论