localStorage:以不同方式存储对象与简单数据类型?

时间:2014-06-06 17:54:31

标签: javascript html5

我已经看到了使用 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中 - 有点混合。

2 个答案:

答案 0 :(得分:1)

除非根据您自己的规则,否则无法知道您的检索字符串是序列化对象还是普通字符串。字符串"null""34""[1,2,3]"都可以是有效的字符串或有效的JSON,除非您对预期内容有所了解,否则无法确定。

所以我建议:

  • 序列化和反序列化所有内容。除非你以非常高的频率进行,否则这在性能方面不应该太差(在这种情况下,localStorage可能是错误的选择)。

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;
},

只是一个未经测试的想法