Показать сообщение отдельно
  #1 (permalink)  
Старый 25.12.2016, 04:06
Новичок на форуме
Отправить личное сообщение для inpost Посмотреть профиль Найти все сообщения от inpost
 
Регистрация: 11.11.2013
Сообщений: 1

Undefined внутри for-in перебора без hasOwnProperty
Всем привет.
Что-то не могу разобраться в том, как работает перебор объекта. Вот код:
if (typeof localStorage === 'object') {
	Storage.prototype.getFullSize = function() {
		var tempLen = 0;
		for(var x in localStorage) {
			tempLen = parseFloat(tempLen) + parseFloat((localStorage[x].length * 2)/1024/1024);
		}
		return tempLen;
	}
}


Ругается на localStorage[x].length, код ошибки: Unable to get property 'length' of undefined or null reference . Эмулировать подобную ошибку не получается, она проявляется в некоторых браузерах, вот один из них: Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; Touch; MATBJS; rv:11.0) like Gecko (IE 11).

Я встречал написание кода из документации с использованием hasOwnProperty:
for (var prop in obj) {
    if(!obj.hasOwnProperty(prop)) continue;
    alert(prop + " = " + obj[prop]);
}


Гуглить пробовал, но не могу найти объяснения, зачем это надо и поможет ли это в данном случае. Почему элемент объекта может быть равен undefined или null ? localStorage.setItem('a',null); пробовал, ошибку в моих браузерах не кидает, включая IE 11.

Подскажите почему происходит в редких браузерах подобная ошибка и как с ней бороться? И второй вопрос, для чего в таких случаях пишется hasOwnProperty, неужели доступа может не быть?
Ответить с цитированием