我为一个应用程序在localStorage中存储了很多值,并且需要一种方法将"字符串"转换回数字-如果它是数字的话。如果稍后强制HTML <input type="number"> on your form, then the data going into the form and extracted from the form IS a number, but once stored - its converted to a string. So to repopulate that
字段,则必须读取localStorage值并在重新填充输入字段之前将其转换回数字-否则您将开始获得许多重复的警告,有时还会出现错误,因为预期是数字,但localStorage正在检索字符串。
我的方法:假设值作为一个数字输入,那么只有一个数字(只有数字)将被存储-因此你可以假设只有数字会出来(即使它们是一个字符串)。只知道返回的是数字,因此可以这样做:
var allVariables = {} ;
var reg = new RegExp(/^d+$/) ; // this accounts for digits only
for (var x=0; x<localStorage.length;x++) {
var keyValue = localStorage.getItem(localStorage.key(x)) ;
if (reg.text(keyValue)) {
keyValue = parseInt(keyValue) ;
}
allVariables[localStorage.key(x)] = keyValue ;
}
我甚至对此进行了扩展,以解释真/假布尔值…不能轻易使用0/1而不与数字混淆。我看到的另一种方法是在键名上加下划线,以标识以后转换的类型:
ie:key1_str
key2_boo
key3_int
key4_obj
key5_flo
然后识别"_xxx"来适当地转换该值。
我要求看到其他人解决这个问题的方法或关于如何改进它的建议和建议。我的并不完美……虽然也不是localStorage…但仍在寻找改进
假设您有"keyName" : "12345"
。棘手的解决方案是:
var newInt = +localStorage.getItem('keyName')
这个额外的+将把字符串转换为整数。
与其存储大量单个键,不如考虑将整个对象存储到更少的存储键中,这些存储键将字符串化为json并在检索时进行解析。JSON方法将保留类型
var obj= {
id:100,
anotherProp:'foo'
}
localStorage.setItem('myObj',JSON.stringify(obj));
var newObj = JSON.parse(localStorage.getItem('myObj'));
console.log(typeof newObj.id)//number
尝试转换:
function getProbablyNumberFromLocalStorage(key) {
var val = localStorage.getItem(key);
return (isNan(+val) || val==null) ? val : +val;
}