2015-02-21 5 views
0

Раньше в любое время я использовал localStorage Мне всегда приходилось использовать JSON.stringify для извлечения кода в качестве объекта.localStorage return Object

Однако я просто использовал localStorage в последней версии Chromium Version 42.0.2308.0 canary (64-bit) и это то, что он вернулся:

localStorage 
Storage {debug: "undefined", uid: "3", length: 2} 

typeof localStorage 
"object" 

Когда и какие браузеры/телефоны теперь поддерживают localStorage как объекты?

+1

'typeof localStorage' не проверяет * содержимое * localStorage – zzzzBov

+0

что это значит в этом контексте :) –

ответ

0

localStorage (объект) всегда был объектно-подобной конструкцией. Это означает, что мы всегда были в состоянии получить доступ к данным таким образом, как

localStorage.foo = 42; 

, чтобы получить эти данные, мы могли бы назвать localStorage.foo или использовать предлагаемые вспомогательные функции, такие как

localStorage.getItem('foo'); 

Но что localStorage в Дело в том, не является объектом, вы можете легко назвать

Object.prototype.toString.call(localStorage); // === [object Storage] 
+0

Умм интересный момент, который вы поднимаете .... Я действительно верю, что вы правильно, раньше мне приходилось использовать JSON.parse на объекте, хранящемся внутри свойство localStorage –

1

От https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage:

«Объекты хранения являются недавним дополнением к стандарту. Таким образом, они не могут присутствовать во всех браузерах. Вы можете обойти эту проблему, вставив один из следующих двух кодов в начале ваших скриптов, что позволяет использовать объект LocalStorage в реализациях, которые изначально не поддерживают его.»

В основном, это должно быть возвращающая тип Object, но некоторые браузеры не так совместимы Вы можете поставить один из следующих двух сценариев в начале кода, чтобы обойти эту проблему:.

if (!window.localStorage) { 
    Object.defineProperty(window, "localStorage", new (function() { 
    var aKeys = [], oStorage = {}; 
    Object.defineProperty(oStorage, "getItem", { 
     value: function (sKey) { return sKey ? this[sKey] : null; }, 
     writable: false, 
     configurable: false, 
     enumerable: false 
    }); 
    Object.defineProperty(oStorage, "key", { 
     value: function (nKeyId) { return aKeys[nKeyId]; }, 
     writable: false, 
     configurable: false, 
     enumerable: false 
    }); 
    Object.defineProperty(oStorage, "setItem", { 
     value: function (sKey, sValue) { 
     if(!sKey) { return; } 
     document.cookie = escape(sKey) + "=" + escape(sValue) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/"; 
     }, 
     writable: false, 
     configurable: false, 
     enumerable: false 
    }); 
    Object.defineProperty(oStorage, "length", { 
     get: function() { return aKeys.length; }, 
     configurable: false, 
     enumerable: false 
    }); 
    Object.defineProperty(oStorage, "removeItem", { 
     value: function (sKey) { 
     if(!sKey) { return; } 
     document.cookie = escape(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; 
     }, 
     writable: false, 
     configurable: false, 
     enumerable: false 
    }); 
    this.get = function() { 
     var iThisIndx; 
     for (var sKey in oStorage) { 
     iThisIndx = aKeys.indexOf(sKey); 
     if (iThisIndx === -1) { oStorage.setItem(sKey, oStorage[sKey]); } 
     else { aKeys.splice(iThisIndx, 1); } 
     delete oStorage[sKey]; 
     } 
     for (aKeys; aKeys.length > 0; aKeys.splice(0, 1)) { oStorage.removeItem(aKeys[0]); } 
     for (var aCouple, iKey, nIdx = 0, aCouples = document.cookie.split(/\s*;\s*/); nIdx < aCouples.length; nIdx++) { 
     aCouple = aCouples[nIdx].split(/\s*=\s*/); 
     if (aCouple.length > 1) { 
      oStorage[iKey = unescape(aCouple[0])] = unescape(aCouple[1]); 
      aKeys.push(iKey); 
     } 
     } 
     return oStorage; 
    }; 
    this.configurable = false; 
    this.enumerable = true; 
    })()); 
} 

«Вот другая, менее точная, имитация объекта LocalStorage , Это проще, чем предыдущий, но он совместим со старыми браузерами, такими как Internet Explorer < 8 (протестирован и работает даже в Internet Explorer 6). Он также использует куки-файлы.»

if (!window.localStorage) { 
    window.localStorage = { 
    getItem: function (sKey) { 
     if (!sKey || !this.hasOwnProperty(sKey)) { return null; } 
     return unescape(document.cookie.replace(new RegExp("(?:^|.*;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"), "$1")); 
    }, 
    key: function (nKeyId) { 
     return unescape(document.cookie.replace(/\s*\=(?:.(?!;))*$/, "").split(/\s*\=(?:[^;](?!;))*[^;]?;\s*/)[nKeyId]); 
    }, 
    setItem: function (sKey, sValue) { 
     if(!sKey) { return; } 
     document.cookie = escape(sKey) + "=" + escape(sValue) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/"; 
     this.length = document.cookie.match(/\=/g).length; 
    }, 
    length: 0, 
    removeItem: function (sKey) { 
     if (!sKey || !this.hasOwnProperty(sKey)) { return; } 
     document.cookie = escape(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/"; 
     this.length--; 
    }, 
    hasOwnProperty: function (sKey) { 
     return (new RegExp("(?:^|;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie); 
    } 
    }; 
    window.localStorage.length = (document.cookie.match(/\=/g) || window.localStorage).length; 
} 

EDIT

Часть этого ответа, что я не поставил в кавычках почти слово за словом на этой странице, за исключением I

+0

Umm Я не спрашивал, является ли localStorage новой: D Извините, если я не был ясен, я больше указывал, что в современных браузерах они автоматически возвращают «объект», а не просто строки если то, что вы хранили в хранилище, уже было «объектом» –

+1

@JamieHutber Да, и это именно так. Тот факт, что вы должны выполнить сжатие JSON, означает, что браузер не поддерживает объекты хранения (по крайней мере, это то, о чем я думаю) – Cilan