chrome.storage 可以保存日期或地图等“高级”对象吗?

Jon*_*Lee 3 local-storage google-chrome-extension

我制作了一个 chrome 扩展来管理互联网历史记录、浏览器 cookie 等。如果您一周没有运行它,我会尝试发出通知,所以chrome.storage每当您使用该扩展时我都会保存时间戳。


这是我的代码:

<弹出.js>

function clear()
{
chrome.browsingData.removeHistory({"since":0}, callback);
var now = new Date();
chrome.storage.local.set({key: now}, function() {
console.log('Value is set to ' + now)
}
Run Code Online (Sandbox Code Playgroud)

(回调是一个空函数)


<背景.js>

chrome.storage.local.get(["key"], function(result) {
alert (result.key)
});
Run Code Online (Sandbox Code Playgroud)

当我测试这个时,它给了我:

[object Object]
Run Code Online (Sandbox Code Playgroud)

为什么这段代码给了我这个,而不是我保存的时间戳?

wOx*_*xOm 8

JSON 类型

chrome.storage,就像 Chrome 中的扩展消息传递一样,仅支持 JSON 兼容类型:

  • 数字但不是BigInt
  • 字符串
  • 布尔值truefalse
  • null但不是undefined
  • 由上述简单类型组成的对象/数组
    • 可以嵌套
    • 不能有循环自引用
    • 键必须是字符串而不是Symbol
    • 无支撑的部分将被剥离,因此将产生复杂的类型{}

它不支持 DOM 元素、类实例、Set、Map、RegExp、Date 等。
这些将被存储为{}.

要查看实际存储的内容,请在代码或 devtools 控制台中运行以下命令:

console.log(JSON.parse(JSON.stringify(obj)))
Run Code Online (Sandbox Code Playgroud)

日期的解决方案

存储 Date.now() 这是一个数字:

chrome.storage.local.set({foo: Date.now()})
Run Code Online (Sandbox Code Playgroud)

要重新创建日期:

chrome.storage.local.get('foo', data => {
   const date = new Date(data.foo);
   // use it here
})
Run Code Online (Sandbox Code Playgroud)

设置/地图解决方案

储存:

chrome.storage.local.set({foo: [...map]})
Run Code Online (Sandbox Code Playgroud)

阅读:

chrome.storage.local.get('foo', data => {
   const map = new Map(data.foo);
   // use it here
})
Run Code Online (Sandbox Code Playgroud)

媒体对象的替代品

  • 转换为数据 URI 字符串。
  • 转换为 ArrayBuffer 并存储在IndexedDB中。

PS 不要用于+连接 console.log 中的字符串和对象。,像这样使用:console.log('Value is set to', now)