经过大量的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]
我认为这是一种非常奇怪的行为。所以我的问题是:
这是故意的吗?是否记录在案?
您能推荐一个好的解决方案来绕过这个限制吗?
我目前的想法是使用JSON.stringify(正确处理这种情况),然后解析字符串。但这似乎很浪费。
感谢。
答案 0 :(得分:4)
正如我在错误报告中所解释的那样,错误的原因是对象是相同的。如果你的对象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});