为啥 null 在 localStorage 中存储为字符串?
Posted
技术标签:
【中文标题】为啥 null 在 localStorage 中存储为字符串?【英文标题】:Why is null stored as a string in localStorage?为什么 null 在 localStorage 中存储为字符串? 【发布时间】:2018-04-19 10:24:22 【问题描述】:在 Chrome 控制台中,我将 foo
设置为 null:
localStorage.setItem("foo",null)
那我测试一下,是否为null:
console.log(localStorage.getItem("foo")==null)
打印false
。
那我测试一下,是不是字符串"null"
:
console.log(localStorage.getItem("foo")=="null")
打印true
。
我认为null
是一个合法的 javascript 值。当我手动清除浏览器中的 localStorage 时,将其存储为字符串 "null"
非常反直觉,并在原本可以正常工作的程序中导致了一个奇怪的错误。
【问题讨论】:
您只能将字符串存储在localStorage
中。
【参考方案1】:
请看https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
所有值都作为字符串存储在本地存储中。您应该在存储数据之前对数据进行字符串化,并在检索数据后解析数据:
localStorage.setItem("foo", JSON.stringify(null));
var value = JSON.parse(localStorage.getItem("foo"));
console.log(value === null);
【讨论】:
【参考方案2】:根据spec,localstorage
使用存储对象接口
interface Storage
readonly attribute unsigned long length;
DOMString? key(unsigned long index);
getter DOMString? getItem(DOMString key);
setter void setItem(DOMString key, DOMString value); //notice this line
deleter void removeItem(DOMString key);
void clear();
;
setter 方法转换为setItem
,只接受DOMString
根据documentation
DOMString 是一个 UTF-16 字符串。由于 JavaScript 已经使用了这样的字符串, DOMString 直接映射到一个字符串。
将 null 传递给通常接受 DOMString 的方法或参数 字符串化为“null”。
【讨论】:
以上是关于为啥 null 在 localStorage 中存储为字符串?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 localStorage 不保留在 Chrome 中?
`localStorage 中的 prop` 与 `localStorage.getItem('prop')!==null`
为啥 auth0 建议不要在 localStorage 中存储令牌?