简体   繁体   English

在javascript中使用似乎无法在任何地方找到的localStorage类型

[英]Using a type of localStorage in javascript that I can't seem to find anywhere

So I have a save and load function I was working on probably a year ago and cannot find example of saving and loading in this manor. 因此,我大概一年前就有一个保存和加载功能,找不到在此庄园中保存和加载的示例。 My issue is that I'm not saving and loading these numbers as integers but I can't remember or find what I need to do to make these numbers save/load as integers. 我的问题是我没有将这些数字保存并加载为整数,但是我不记得或找不到使这些数字保存/加载为整数的方法。 Sorry for such a trivial question but this is always a great place to go. 很抱歉遇到这样一个琐碎的问题,但这始终是一个不错的选择。

   function saveGame() {
            localStorage["ClickMiner.savedBefore"] = savedBefore;
            localStorage["ClickMiner.manaRefilCost"] = manaRefilCost;
            localStorage["ClickMiner.rocks"] = rocks;
            localStorage["ClickMiner.miningXp"] = miningXp;
            localStorage["ClickMiner.miningLevel"] = miningLevel;
            localStorage["ClickMiner.pickaxes"] = pickaxes;
            localStorage["ClickMiner.pebbleGrowers"] = pebbleGrowers;
            //localStorage["ClickMiner.rockTier"] = rockTier;
            localStorage["ClickMiner.rockTierCost"] = rockTierCost;
            localStorage["ClickMiner.bankedRocks"] = bankedRocks;
            updateTextBox("Game Saved");
            return true;
    } 

     function loadGame() {
            savedBefore = (localStorage["ClickMiner.savedBefore"]);
            manaRefilCost = (localStorage["ClickMiner.manaRefilCost"]);
            rocks  = (localStorage["ClickMiner.rocks"]);
            miningXp = (localStorage["ClickMiner.miningXp"]);
            miningLevel = (localStorage["ClickMiner.miningLevel"]);
            pickaxes = (localStorage["ClickMiner.pickaxes"]);
            pebbleGrowers = (localStorage["ClickMiner.pebbleGrowers"]);
            //rockTier = (localStorage["ClickMiner.rockTier"]);
            rockTierCost = (localStorage["ClickMiner.rockTierCost"]);
            bankedRocks = (localStorage["ClickMiner.bankedRocks"]);
            updateTextBox("Game Loaded");
            return true;
    } 

     function newGame() {
        savedBefore = 1;
        localStorage["ClickMiner.savedBefore"] = savedBefore;
        localStorage["ClickMiner.manaRefilCost"] = manaRefilCost;
        localStorage["ClickMiner.rocks"] = rocks;
        localStorage["ClickMiner.miningXp"] = miningXp;
        localStorage["ClickMiner.miningLevel"] = miningLevel;
        localStorage["ClickMiner.pickaxes"] = pickaxes;
        localStorage["ClickMiner.pebbleGrowers"] = pebbleGrowers;
        //localStorage["ClickMiner.rockTier"] = rockTier;
        localStorage["ClickMiner.rockTierCost"] = rockTierCost;
        localStorage["ClickMiner.bankedRocks"] = bankedRocks;
        location.reload();
        updateTextBox("New Game Started.");
        return true;
    } 

Localstorage works only with strings. Localstorage仅适用于字符串。

parseInt(variable)

Should do the job 应该做的工作

If you want a thing to be an integer, all you need to do is use the parseInt function. 如果您想让某个东西成为整数,则只需使用parseInt函数即可。 Everything stored in localStorage is a string, so you would do the integer conversion in loadGame() . 存储在localStorage中的所有内容都是一个字符串,因此您将在loadGame()进行整数转换。

Like this: 像这样:

function loadGame() {
    savedBefore = parseInt(window.localStorage["ClickMiner.savedBefore"], 10);
    // and so on...

}

The 10 of parseInt(aThing, 10) is the radix, meaning you want base10 integers (0-9) and not binary, hex or some other number system. 10parseInt(aThing, 10)为基数,这意味着你要base10整数(0-9),而不是二进制,十六进制或一些其他数字系统。

Instead of pushing the storage for saving data as integer, I would prefer to ensure if my data type is integer. 我宁愿确保我的数据类型是否为整数,而不是推送用于将数据保存为整数的存储器。 If I am pretty sure if my data in expected type then, I would use JSON.stringify and JSON.parse to between write and read operations. 如果我很确定自己的数据是否为预期类型,则可以在写入和读取操作之间使用JSON.stringifyJSON.parse Because localStorage will accept only string value. 因为localStorage只接受字符串值。 That mean, if you give a number as value it will be converted to string. 这意味着,如果您提供数字作为值,它将被转换为字符串。 So, the output type from localStorage will be string. 因此,localStorage的输出类型将为字符串。

By considering all of above, here is a quick snippet to achive your expectations by avoiding many changes on your code. 考虑了以上所有内容后,这里有一个简短的摘要,可以避免对代码进行很多更改来达到您的期望。

 const localStorageProxy = new Proxy(localStorage, { get(target, prop){ if(target.hasOwnProperty(prop) && typeof target[prop] === "function"){ return target[prop]; } return JSON.parse(target.getItem(prop)||"null"); }, set(target, prop, value){ target.setItem(prop, JSON.stringify(value)); } }); // testing console.log(localStorageProxy["testNumber"]); localStorageProxy["testNumber"] = 123; console.log(localStorageProxy["testNumber"], typeof localStorageProxy["testNumber"]); 

PS: The snippet above may not work correctly because of security restrictions. PS:由于安全限制,上面的代码段可能无法正常工作。 Here is the fiddle link 这是小提琴链接

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM