Refspec для устранения неоднозначности локальных и удаленных тегов, а также веток с тем же именем [Дубликат]

Stringify не решает всех проблем

Кажется, что ответы здесь не охватывают все типы, которые возможны в JavaScript, поэтому вот несколько коротких примеров того, как правильно их решить:

//Objects and Arrays:
    var obj = {key: "value"};
    localStorage.object = JSON.stringify(obj);  //Will ignore private members
    obj = JSON.parse(localStorage.object);
//Boolean:
    var bool = false;
    localStorage.bool = bool;
    bool = (localStorage.bool === "true");
//Numbers:
    var num = 42;
    localStorage.num = num;
    num = +localStorage.num;    //short for "num = parseFloat(localStorage.num);"
//Dates:
    var date = Date.now();
    localStorage.date = date;
    date = new Date(parseInt(localStorage.date));
//Regular expressions:
    var regex = /^No\.[\d]*$/i;     //usage example: "No.42".match(regex);
    localStorage.regex = regex;
    var components = localStorage.regex.match("^/(.*)/([a-z]*)$");
    regex = new RegExp(components[1], components[2]);
//Functions (not recommended):
    function func(){}
    localStorage.func = func;
    eval( localStorage.func );      //recreates the function with the name "func"

Я не рекомендую хранить функции, потому что eval() злой может привести к проблемам безопасности, оптимизации и отладки. В общем случае eval() никогда не следует использовать в JavaScript-коде.

Частные члены

Проблема с использованием JSON.stringify() для хранения объектов заключается в том, что эта функция не может сериализовать закрытых членов , Эта проблема может быть решена путем перезаписи метода .toString() (который неявно используется при хранении данных в веб-хранилище):

//Object with private and public members:
    function MyClass(privateContent, publicContent){
        var privateMember = privateContent || "defaultPrivateValue";
        this.publicMember = publicContent  || "defaultPublicValue";

        this.toString = function(){
            return '{"private": "' + privateMember + '", "public": "' + this.publicMember + '"}';
        };
    }
    MyClass.fromString = function(serialisedString){
        var properties = JSON.parse(serialisedString || "{}");
        return new MyClass( properties.private, properties.public );
    };
//Storing:
    var obj = new MyClass("invisible", "visible");
    localStorage.object = obj;
//Loading:
    obj = MyClass.fromString(localStorage.object);

Циркулярные ссылки

Другая проблема stringify может В этом примере JSON.stringify() выдаст TypeError «Преобразование круговой структуры в JSON» . Если нужно сохранить циклические ссылки, может быть использован второй параметр JSON.stringify():

var obj = {id: 1, sub: {}};
obj.sub["circular"] = obj;
localStorage.object = JSON.stringify( obj, function( key, value) {
    if( key == 'circular') {
        return "$ref"+value.id+"$";
    } else {
        return value;
    }
});

Однако найти эффективное решение для хранения циклических ссылок сильно зависит от задач, которые необходимо решить, и восстановление таких данных также не является тривиальным.

Уже существует некоторый вопрос о SO, посвященный этой проблеме: Stringify (конвертировать в JSON) объект JavaScript с круглой ссылкой

0
задан CoDEmanX 20 March 2019 в 13:08
поделиться