И прямой доступ к свойствам ( 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являются стандартизированным способом ведения дел.