我已经看到了使用 JSON.stringify和JSON.parse 来存储和检索HTML5 localStorage中的值/对象的方法。 它有效,但它"字符串化"一切 - 包括字符串,数字等。我想改进它。我想避免"字符串化"不是对象的简单数据类型。我在下面有一个方法,用于确定参数是否为对象,如果是对象,则使用JSON.stringify。
lsSet: function(key, value) {
((Object.prototype.toString.call(value) === '[object Object]'))
? localStorage.setItem(key,JSON.stringify(value))
: localStorage.setItem(key,value);
return (localStorage.getItem(key)) ? true : false;
},
是否有一种很好的方法来确定您正在检索的localStorage字符串是否是字符串化对象?我正在考虑检查字符串是否以{开头}结束,但似乎必须有更好的方法。下面是我当前的localStorage get方法,但在尝试使用JSON.parse简单数据类型(如string)时会抛出错误。
lsGet: function(key) {
return JSON.parse(localStorage.getItem(key));
},
典型的控制台错误是由于JSON.parse:
Uncaught SyntaxError: Unexpected token E
有什么想法吗?想到了一个想法,也许只是一个尝试/捕获?
var value;
try {
value = JSON.parse(localStorage.getItem(key));
} catch(err) {
value = localStorage.getItem(key);
}
return value;
编辑:注意,我正在处理大量不同的数据,我真的不想担心我设置/获取的数据类型。因此创建了标准lsSet / lsGet方法。在我的应用程序中,数据存储在PHP Session,JavaScript Objects和localStorage中 - 有点混合。
答案 0 :(得分:1)
除非根据您自己的规则,否则无法知道您的检索字符串是序列化对象还是普通字符串。字符串"null"
,"34"
,"[1,2,3]"
都可以是有效的字符串或有效的JSON,除非您对预期内容有所了解,否则无法确定。
所以我建议:
OR
"JSON:{...}"
。然后,当您检索字符串时,请检查标题并相应地处理。答案 1 :(得分:0)
lsSet: function(key, value) {
switch(typeof value){
case "string" : localStorage.setItem(key,'"' + value + '"'); break;
case "number" : localStorage.setItem(key,value); break;
case "object" : localStorage.setItem(key,JSON.stringify(value)); break;
}
return (localStorage.getItem(key)) ? true : false;
},
只是一个未经测试的想法