6

我使用会话存储来设置一个可以采用数值或null. 我注意到无论我输入什么,该字段都存储为字符串。有没有一种很好的方法可以将我的存储值转换回null

例如,我想检查我的代码:

if (!sessionStorage.getItem('key')) {
   // do something
}

进行该检查的最佳方法是什么?显而易见的方法是

 if (!sessionStorage.getItem('key') !== "null") {
       // do something
 }

我想知道是否有替代方案。

4

5 回答 5

10

你可以解析它

JSON.parse('null') // null
JSON.parse('1')   //  1

所以

var val = sessionStorage.getItem('key');
val = JSON.parse(val);

接近施法

替代方案是:

var val = sessionStorage.getItem('key');
val = val*1 || null;
于 2016-03-10T21:30:42.307 回答
2

我只想要一些评估为假的东西

您可以使用空字符串来标记未设置的值:

sessionStorage.setItem('key','');

这样您就可以重复使用当前的支票:

if (!sessionStorage.getItem('key')) {
   // do something
}

也就是说,您提到您有一个下拉菜单来选择值,这就是您需要这样一个值的原因,但我认为涉及删除 null 值上的项目的解决方案会更好。这是一个工作演示,以及用于制作它的代码:

var dd = document.getElementById('dropdown');

dd.addEventListener('change', function(){
  var value = this.value;
  if (value === 'null')
    sessionStorage.removeItem('key');
  else sessionStorage.setItem('key', value);
});

var check = document.getElementById('check');
check.addEventListener('click', function(){
    this.innerHTML = 'Value: '+sessionStorage.getItem('key')+
                     ', check: '+(!sessionStorage.getItem('key'));
});
<select id="dropdown">
  <option value="null">none</option>
  <option>1</option>
  <option>2</option>
  <option>3</option>
  <option>4</option>
  <option>5</option>
</select>

<button id="check">Check value</button>
于 2016-03-10T21:35:20.893 回答
2

在将值写入存储之前将其序列化为 JSON。

var json = JSON.stringify(val);

然后在你再次读出来的时候解析它。

try {
  var val = JSON.parse(storage.item);
} catch(ex) {
  // handle errors
}

将解析器包装在 try 块中很重要。如果用户或浏览器清除了会话存储,那么您将尝试JSON.parse('undefined')其中会引发错误。

于 2016-03-10T21:33:41.347 回答
0

sessionStorage 是一个键值数据库,两者都存储为字符串。您可以查看DOMStringStorage.setItem ()Storage.getItem()的文档说明。

这样的性质是您检索的对象将始终是字符串。您将不得不通过应用JSON.parse()或完全手动的方法手动投射它们。null没有任何操作就无法取回。

已经提到的另一种方法是避免null在 sessionStorage 中存储值。检查密钥是否存在比事后正确转换更容易。

于 2016-03-10T21:32:54.330 回答
-1

由于返回的语句是字符串,你可以说if(!sessionStorage.setItem('key','')) {}

于 2016-03-10T21:33:39.527 回答