Корректный способ итерации сквозь объекты
JavaScript удивительно мощный язык и, пожалуй самой мощным его свойством является возможность динамического конструирования объектов. Одной из часто встречающихся задач возникающих при работе с JavaScript является итерация по всем элементам объекта.
Допустим, у нас есть объект созданный вот таким образом:
var obj = {property1:"свойство 1",property2:"свойство 2"};
вот самый распространенный НЕПРАВИЛЬНЫЙ способ показать все свойства объекта:
for(key in obj){ alert(key); }
Вроде все работает правильно и на экране действительно последовательно покажутся все свойства объекта. Почему такой способ является неправильным?
Добавим перед циклом вот такую строчку:
Object.prototype['test1'] = "test1 value";
При запуске скрипта еще раз оказывается, что наш объект волшебным образом приобретает еще одно свойство - test1, хотя мы его не создавали! Это значит что любая сторонняя библиотека которая таким способом расширяет функциональность стандартных классов JavaScript, например prototype.js способна непредсказуем образом изменить логику работы ваших программ. В данном случае хорошим тоном является сравнение текущего свойства и свойства прототипа при каждой итерации, если они равны, значит ничего не делаем:
for(key in obj){ if (obj.constructor.prototype[key]!==obj[key]){ alert(obj[key]); } }
Обратите внимание, что здесь использовано строгое сравнение !==. Все просто, все логично, вот только набирать это каждый раз довольно утомительно, поэтому создадим вот такую функцию:
function forEach(obj,fn){ for(key in obj){ if (obj.constructor.prototype[key]!==obj[key]){ if (fn(key)===false) break; } } }
В этом случае итерация запишется совсем просто:
forEach(obj,function(key){ alert(obj['key']); });
Обратите внимание, что в функции forEach есть возможность остановить итерацию досрочно, что бывает полезно например при поиске элемента, для этого достаточно возвратить false:
forEach(obj,function(key){ alert(obj['key']); if (key=='property1') return false; });
разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться
комментарии: