chrome.storage.local奇怪的行为:被重复的对象搞糊涂了

时间:2016-04-26 18:28:03

标签: google-chrome-extension

经过大量的bug搜索后,我设法将问题缩小到这段代码:

dup = {a: [1]}
chrome.storage.local.set({x: [dup, dup]});
chrome.storage.local.get(["x"], function(o) {console.log(JSON.stringify(o['x']));});

打印出来:[{"a":[1]},null]

我认为这是一种非常奇怪的行为。所以我的问题是:

  1. 这是故意的吗?是否记录在案?

  2. 您能推荐一个好的解决方案来绕过这个限制吗?

  3. 我目前的想法是使用JSON.stringify(正确处理这种情况),然后解析字符串。但这似乎很浪费。

    感谢。

1 个答案:

答案 0 :(得分:4)

  1. 不,这不是故意的,应该reported作为一个错误:https://crbug.com/606955(现在它已经修复了Chrome 52!)。
  2. 正如我在错误报告中所解释的那样,错误的原因是对象是相同的。如果你的对象dup只包含简单值(即没有嵌套数组或对象,只有原始值,如字符串,数字,布尔值,null,......),那么对象的浅层克隆就足够了:

    dup = {a: [1]}
    dup2 = Object.assign({}, dup);
    chrome.storage.local.set({x: [dup, dup2]});
    

    如果需要支持嵌套对象,则必须进行深度克隆。有许多现有的库或代码片段,所以我不会在这里重复它。为chrome.storage准备值的一种简单方法是将其序列化为JSON,然后再次解析(然后所有对象都是唯一的)。

    dup = {a: [1]}
    var valueToSave = JSON.parse(JSON.stringify([dup, dup]));
    chrome.storage.local.set({x: valueToSave});
    
    // Or:
    var valueToSave = [ dup, JSON.parse(JSON.stringify(dup)) ];
    chrome.storage.local.set({x: valueToSave});