问题点:
最近在使用getStorage/setStorage方法时出现存取后数据不对称。然后进行了调试检查,发现以下情况:
Date类型的数据进行直接存取是正常的,但是要是Date变量放在了Object对象里面作为属性时,存取后类型变了。
api文档是这么说的:
any data
需要存储的内容。只支持原生类型、Date、及能够通过JSON.stringify
序列化的对象。
我就纳闷了,Object支持,Date支持,但Date放到Object里面却把Date类型的属性变成了字符串类型。
(直接打印出来是发现不了问题的,但在做日期格式化的时候就会发现他不是Date类型,报错!)
测试代码:
var date = new Date();
console.log("typeof date :" + typeof (date)); //object
wx.setStorageSync("test_date", date);
var date2 = wx.getStorageSync("test_date");
console.log("typeof date2 :" + typeof (date2)); //object
var obj = {};
obj.date = date;
console.log("typeof obj.date :" + typeof (obj.date)); //object
wx.setStorageSync("test_obj", obj);
obj = wx.getStorageSync("test_obj");
console.log("typeof obj.date2 :" + typeof (obj.date)); //string
//console.log("typeof obj.date2 :" + typeof (new Date(obj.date)));//object
结论:
这也不能算是个bug,但是既然支持Date类型数据,那么作为Object的属性时也应该可以做到Date类型的支持吧,递归每个属性做一样的处理不就行了。(当然,这只是我简单猜测,实现起来难不难不清楚,但希望可以优化下,毕竟这种需求是很常见的。)
临时处理方案:
把拿出来的Date类型属性值:obj.date 再初始化一下就可以恢复原来的类型和数值了:new Date(obj.date)