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

Javascript localStorage:以不同的方式存储对象和简单数据类型?,javascript,html,Javascript,Html,我见过使用JSON.stringify和JSON.parse从HTML5 localStorage存储和检索值/对象的方法它可以工作,但它“字符串化”了所有内容——包括字符串、数字等。我想改进它。我希望避免“串化”不是对象的简单数据类型。下面有一个方法,用于确定参数是否是对象,如果是对象,则使用JSON.stringify lsSet: function(key, value) { ((Object.prototype.toString.call(value) === '[object O

我见过使用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会话、JavaScript对象和localStorage中—有点混合。

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

因此,我建议:


  • 序列化和反序列化所有内容。这在性能方面应该不会太差,除非您使用的频率非常高(在这种情况下,本地存储可能是错误的选择)

  • 向序列化字符串添加自定义“头”,例如
    “JSON:{…}”
    。然后,在检索字符串时,检查头并相应地处理

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

因此,我建议:


  • 序列化和反序列化所有内容。这在性能方面应该不会太差,除非您使用的频率非常高(在这种情况下,本地存储可能是错误的选择)

  • 向序列化字符串添加自定义“头”,例如
    “JSON:{…}”
    。然后,在检索字符串时,检查头并相应地处理
只是一个未经检验的想法


只是一个未经测试的想法

难道您不知道要将什么放入本地存储吗?当应用程序放在那里时,为什么您不知道您正在检索什么?为什么您不使用请在出现错误时提供
localStorage.getItem(key)
的值,这样我们就可以在解析时检查为什么会有错误。@thattidotguy-很多数据类型。我不想担心我正在设置的字体。因此,标准lsGet/lsSet@sabithpocker-typeof不能用于来自本地存储的数据。您不知道要将什么放入本地存储吗?当应用程序放在那里时,为什么您不知道您正在检索什么?为什么您不使用请在出现错误时提供
localStorage.getItem(key)
的值,这样我们就可以在解析时检查为什么会有错误。@thattidotguy-很多数据类型。我不想担心我正在设置的字体。因此,标准lsGet/lsSet@sabithpocker-typeof不能用于来自localStorage的数据。“序列化和反序列化所有内容。”-似乎是最好的建议。这是您在localStorage get/set中看到的最常见的方法吗?如果您处理的是大量任意数据,我认为是这样。在这种情况下,您需要平衡(反)序列化的潜在性能影响与不同数据类型处理的额外复杂性;除非性能对您来说是一个大问题,否则简单性将获胜。在一个地方本地化get/set意味着您可以随时升级到复杂、更高性能的选项(如果需要)。“序列化和反序列化所有内容”-似乎是最好的建议。这是您在localStorage get/set中看到的最常见的方法吗?如果您处理的是大量任意数据,我认为是这样。在这种情况下,您需要平衡(反)序列化的潜在性能影响与不同数据类型处理的额外复杂性;除非性能对您来说是一个大问题,否则简单性将获胜。在单个位置本地化get/set意味着您可以随时升级到复杂的、更高性能的选项(如果需要)。
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;
},