为啥 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 中存储为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库中存进的是中文,为啥查出来的乱码?

为啥 localStorage 不保留在 Chrome 中?

`localStorage 中的 prop` 与 `localStorage.getItem('prop')!==null`

为啥 auth0 建议不要在 localStorage 中存储令牌?

localstorage.getitem('key') 有时返回 null - 在反应应用程序中

为啥javascript localStorage不持久并删除值[关闭]