Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Пишем как обычно. И бьём по рукам в процессе код-ревью за всякие неочевидные финты ушами типа патчинга прототипа Object или ненужные игры со скоупом. Одно дело - когда пишешь библиотеку типа jQuery, которую будет использовать каждая обезьяна и она обязана быть непробиваемой (насколько это возможно), другое - когда пишешь бизнес-логику на основе существующего фреймворка, которую после тебя ещё кто-то будет поддерживать.
>А почему нельзя вызвать mustform.hasOwnProperty(i) -
Там какие-то проблемы с биндингом вроде были, вы мне еще разницу между питоном и js объясняли, так?
Если подействовать этим на φ, эта самая φ выполнится для всех свойств mustform, которые действительно есть в mustform.
Почему так?
1. Простой for..in вызовет φ и для прототипа:
function A(){}
A.prototype.x = 3;
var a = new A;
a.y = 5;
for(var i in a) console.log(i); // x y
И вот мы решили использовать hasOwnProperty.
2. Если мы хотим создать словарь без всякого мусора в прототипе (http://govnokod.ru/16567#comment250319), то hasOwnProperty у нас не будет:
var a = Object.create(null);
a.x = 3;
for(var i in a) if(a.hasOwnProperty(i)) console.log(i);
// Uncaught TypeError: a.hasOwnProperty is not a function(…)
И вот мы решили использовать hasOwnProperty для объектов в стиле ООП и простой for..in для объектов-словарей, ведь у них ни прототипа, ни hasOwnProperty.
3. Если в объект добавить конструктор/прототип, он проявит новые свойства:
var a = Object.create(null);
a['__proto__'] = {x: 3}; // вот был у нас пользователь __proto__, хотим сохранить, что он ввёл тройку в x
a['y'] = 5;
for(var i in a) console.log(i); // x y
Наконец мы решаем всё проверять, но взять hasOwnProperty там, где он действительно будет
4. Кажется, работает:
var a = Object.create(null);
a['__proto__'] = {x: 3};
a['y'] = 5;
for(var i in a)
if({}.hasOwnProperty.call(a, i))
console.log(i); // y
Но это же ECMAScript, как может что-то работать без подвохов?
1. Кто-нибудь может изменить Object.prototype:
Но это уже ССЗБ и неизлечимо.
2. В Хроме __proto__ уже не работает и выводится как обычное поле, в Node.js оно вроде бы ещё считается особенным, поэтому результаты кода №3 и кода №4 показаны как в Node, а в браузере добавится итерация по __proto__.
Итого:
1. Обращение к словарю:
{}.hasOwnProperty.call(dict, key) && dict[key]
2. Вопрос читателям: Как пройтись по всем свойствам словаря?
Пришло время написать свой foreach
foreach сам не напишется, напиши его, напиши его еще раз!
Тупые лохи на всех возможных языках юзают готовый, но я слишком умный для этого!
> error=1;
> if(error>0) return false; else return true;
Вроде и знает о булах, но не юзает...
А почему нельзя вызвать mustform.hasOwnProperty(i) - х.з. Об этом надо спросить 1024--.
Пример: hasOwnProperty как свойство
А ты ж ёбаный ты ж нахуй... Как вы вообще на этом пишете?
Там какие-то проблемы с биндингом вроде были, вы мне еще разницу между питоном и js объясняли, так?
Почему так?
1. Простой for..in вызовет φ и для прототипа:
И вот мы решили использовать hasOwnProperty.
2. Если мы хотим создать словарь без всякого мусора в прототипе (http://govnokod.ru/16567#comment250319), то hasOwnProperty у нас не будет:
И вот мы решили использовать hasOwnProperty для объектов в стиле ООП и простой for..in для объектов-словарей, ведь у них ни прототипа, ни hasOwnProperty.
3. Если в объект добавить конструктор/прототип, он проявит новые свойства:
Наконец мы решаем всё проверять, но взять hasOwnProperty там, где он действительно будет
4. Кажется, работает:
Но это же ECMAScript, как может что-то работать без подвохов?
1. Кто-нибудь может изменить Object.prototype:
Но это уже ССЗБ и неизлечимо.
2. В Хроме __proto__ уже не работает и выводится как обычное поле, в Node.js оно вроде бы ещё считается особенным, поэтому результаты кода №3 и кода №4 показаны как в Node, а в браузере добавится итерация по __proto__.
Итого:
1. Обращение к словарю:
2. Вопрос читателям: Как пройтись по всем свойствам словаря?
Вроде бы должно работать.
foreach сам не напишется, напиши его, напиши его еще раз!
Тупые лохи на всех возможных языках юзают готовый, но я слишком умный для этого!
Вот как точно и ёмко одной фразой описал ECMAScript!