Недавно я задал вопрос о LocalStorage . Использование JSON.parse(localStorage.item)
и JSON.parse(localStorage['item'])
не работали, чтобы вернуться, NULL
когда элемент еще не был установлен.
Однако JSON.parse(localStorage.getItem('item')
сработало. И, оказывается, JSON.parse(localStorage.testObject || null)
тоже работает.
Один из комментариев в основном говорят , что localStorage.getItem()
и localStorage.setItem()
всегда следует отдавать предпочтение:
Геттер и сеттер обеспечивают согласованный, стандартизованный и кроссбраузерный способ работы с LS api и всегда должны быть предпочтительнее других способов. - Кристоф
Мне нравится использовать сокращенные обозначения точек и скобок для localStorage, но мне любопытно узнать, как другие относятся к этому. Является ли localStorage.getItem ('item') лучше, чем localStorage.item или localStorage ['item'], ИЛИ пока они работают, допустимы сокращенные обозначения?
источник
getItem
иsetItem
являются стандартизированным способом ведения дел.getItem
/setItem
методов. Я прочту спецификации позже, но единственный надежный способ ответить на ваш вопрос - это тестирование во всех основных браузерах.localStorage.item
тоже не стандартизировано?getItem
/,setItem
потому что эти методы не конфликтуют с существующими свойствамиlocalStorage
объекта. Пример:localStorage.setItem('getItem', 'blah'); console.log(localStorage.getItem('getItem'));
работает, а методlocalStorage.getItem = 'blah';
localStorage будет перезаписанgetItem
. jsfiddle.net/DrquYОтветы:
И прямой доступ к свойствам (
localStorage.item
илиlocalStorage['item']
), и использование функционального интерфейса (localStorage.getItem('item')
) работают нормально. Оба являются стандартными и совместимы с несколькими браузерами. * Согласно спецификации :Просто они ведут себя по-другому, когда не найдено пары ключ / значение с запрошенным именем. Например, если ключ
'item'
не существует,var a = localStorage.item;
будетa
иметь значениеundefined
, а значениеvar a = localStorage.getItem('item');
будетa
иметь значениеnull
. Как вы обнаружили,undefined
иnull
не являются взаимозаменяемыми в JavaScript / ECMAScript. :)РЕДАКТИРОВАТЬ: Как указывает Кристоф в своем ответе , функциональный интерфейс - это единственный способ надежно хранить и извлекать значения под ключами, равными предопределенным свойствам
localStorage
. (Есть шесть из них:length
,key
,setItem
,getItem
,removeItem
, иclear
.) Так, например, следующий будет всегда работа:localStorage.setItem('length', 2); console.log(localStorage.getItem('length'));
Обратите внимание, в частности, что первый оператор не повлияет на свойство
localStorage.length
(за исключением, возможно, увеличения его, если ключ'length'
уже не был вlocalStorage
). В этом отношении спецификация кажется внутренне противоречивой.Однако следующее, вероятно, не даст того, что вы хотите:
localStorage.length = 2; console.log(localStorage.length);
Интересно, что первый из них не работает в Chrome, но является синонимом функционального вызова в Firefox. Второй всегда будет записывать количество ключей, присутствующих в
localStorage
.* Это верно для браузеров, которые в первую очередь поддерживают веб-хранилище. (Сюда входят почти все современные настольные и мобильные браузеры.) Для сред, имитирующих локальное хранилище с помощью файлов cookie или других методов, поведение зависит от используемой прокладки. Несколько polyfills для
localStorage
могут быть найдены здесь .источник
Вопрос уже довольно старый, но, поскольку я был процитирован в вопросе, я думаю, что должен сказать два слова о своем заявлении.
Объект хранилища довольно особенный, это объект, который предоставляет доступ к списку пар ключ / значение. Таким образом, это не обычный объект или массив.
Например, у него есть атрибут длины, который, в отличие от атрибута длины массива, доступен только для чтения и возвращает количество ключей в хранилище.
С массивом вы можете:
var a = [1,2,3,4]; a.length // => 4 a.length = 2; a // => [1,2]
Здесь у нас есть первая причина использовать геттеры / сеттеры. Что делать, если вы хотите установить элемент с именем
length
?localStorage.length = "foo"; localStorage.length // => 0 localStorage.setItem("length","foo"); // the "length" key is now only accessable via the getter method: localStorage.length // => 1 localStorage.getItem("length") // => "foo"
С другими членами объекта Storage это еще более критично, поскольку они доступны для записи, и вы можете случайно перезаписать такие методы, как
getItem
. Использование методов API предотвращает любые из этих возможных проблем и обеспечивает согласованный интерфейс.Также интересным моментом является следующий абзац в спецификации (выделенный мной):
Теоретически не должно быть разницы между геттерами / сеттерами и
[]
доступом, но мало ли ...источник
length
Свойство не изменится (по крайней мере , в Chrome и Firefox [*]) , если вы звонитеlocalStorage.setItem("length", something);
, но вы можете получитьsomething
сlocalStorage.getItem("length");
. Интересно, что назначениеlocalStorage.length = something;
в Chrome не работает, но в Firefox оно будет хранитьсяsomething
под ключом"length"
(который затем вы можете получить только с помощью функционального интерфейса). [*] На самом деле в Firefoxlength
свойство изменится, если ключ"length"
еще не введенlocalStorage
.localStorage
имеет шесть предопределенных свойств:length
,key
,getItem
,setItem
,removeItem
, иclear
.Я знаю, что это старый пост, но поскольку никто на самом деле не упомянул производительность, я настроил несколько тестов JsPerf для его тестирования, а также для того, чтобы он был согласованным интерфейсом
getItem
иsetItem
они также постоянно быстрее, чем использование точечной нотации или скобок, а также их намного легче читать.Вот мои тесты на JsPerf
источник
getItem
иsetItem
были самыми медленными в каждой категории, причем точка была самой быстрой в Chrome, а скобка была самой быстрой в Firefox. Я также думаю, что «намного легче читать» - это полностью субъективно ... да, в нем говорится о выполняемой функции, но любой, кто когда-либо работал с объектами или переменными массива, узнает за полсекунды, что происходит с точкой / скобкой.Как уже было сказано, разницы почти нет, кроме несуществующего ключа. Разница в производительности варьируется в зависимости от того, какой браузер / ОС вы используете. Но на самом деле это не так уж и сложно.
Я предлагаю вам использовать стандартный интерфейс просто потому, что это рекомендуемый способ его использования.
источник