И прямой доступ к свойствам ( localStorage.item
или localStorage['item']
), и использование функционального интерфейса ( localStorage.getItem('item')
) работают нормально. Оба являются стандартными и совместимы с несколькими браузерами. * Согласно спецификации :
Имена поддерживаемых свойств объекта Storage - это ключи каждой пары ключ / значение, присутствующей в настоящее время в списке, связанном с объектом, в том порядке, в котором ключи были добавлены в область хранения в последний раз.
Просто они ведут себя по-другому, когда не найдено пары ключ / значение с запрошенным именем. Например, если ключ '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
могут быть найдены здесь .
getItem
иsetItem
являются стандартизированным способом ведения дел.