1. JavaScript / Говнокод #18810

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    function checkForm(form, mustform){
    	error=0;
    	if(mustform){
    		for(i in mustform) if(form.elements[mustform[i]]){
    			if(!form.elements[mustform[i]].value){
    				error=1;
    				jQuery(form.elements[mustform[i]]).next().remove();
    				jQuery(form.elements[mustform[i]]).parent().append('<div style="color:red">поле обязательно к заполнению</div>');
    			} else jQuery(form.elements[mustform[i]]).next('div').remove();
    		}
    		if(error>0) return false; else return true;
    	} else return true;
    }

    такого codestyle не встречал))

    Запостил: progsmile, 02 Октября 2015

    Комментарии (23) RSS

    • > error=0;
      > error=1;
      > if(error>0) return false; else return true;
      Вроде и знает о булах, но не юзает...
      Ответить
      • зарезервировал для других кодов ошибки
        Ответить
    • Доебусь до столба: где hasOwnProperty в for-in, блеать?
      Ответить
      • Да! Почему меня не пригласили?
        Ответить
      • Исправил.
        for(i in mustform) if({}.hasOwnProperty.call(mustform, i))
        Ответить
        • Что это делает?
          Ответить
          • Проверяет, что у mustform действительно есть своё, не унаследованное от прототипа поле i.

            А почему нельзя вызвать mustform.hasOwnProperty(i) - х.з. Об этом надо спросить 1024--.
            Ответить
            • https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

              Пример: hasOwnProperty как свойство

              А ты ж ёбаный ты ж нахуй... Как вы вообще на этом пишете?
              Ответить
              • Пишем как обычно. И бьём по рукам в процессе код-ревью за всякие неочевидные финты ушами типа патчинга прототипа 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:
            Object.prototype.hasOwnProperty = function(){ return true; }

            Но это уже ССЗБ и неизлечимо.
            2. В Хроме __proto__ уже не работает и выводится как обычное поле, в Node.js оно вроде бы ещё считается особенным, поэтому результаты кода №3 и кода №4 показаны как в Node, а в браузере добавится итерация по __proto__.

            Итого:
            1. Обращение к словарю:
            {}.hasOwnProperty.call(dict, key) && dict[key]

            2. Вопрос читателям: Как пройтись по всем свойствам словаря?
            Ответить
            • Вывод: в JS нет словарей.
              Ответить
              • Но до них один шаг:
                var PREFIX = '.';
                
                function Dict(){
                  this.data = {};
                }
                
                Dict.prototype.setValue = function(key, value) {
                  this.data[PREFIX + key] = value;
                };
                
                Dict.prototype.getValue = function(key) {
                  return this.data[PREFIX + key];
                };
                
                Dict.prototype.keys = function() {
                  var keys = [];
                  
                  for(var key in this.data)
                    if(key.substring(0, PREFIX.length) === PREFIX)
                      keys.push(key);
                  
                  return keys;
                };
                
                Dict.prototype.values = function() {
                  var data = this.data;
                  return this.keys().map(function(key){ return data[key]; });
                };

                Вроде бы должно работать.
                Ответить
                • Решение в духе башевского if [ "x$var" = "xyes" ]; then
                  Ответить
                • Да я смотрю, у вас там всё есть, просто нужно написать свой foreach.
                  Ответить
                  • Ну есть уже for.. of
                    Ответить
                  • Пришло время написать свой foreach
                    foreach сам не напишется, напиши его, напиши его еще раз!
                    Тупые лохи на всех возможных языках юзают готовый, но я слишком умный для этого!
                    Ответить
            • Не заводить словарей от прототипов с перечисляемыми свойствами.
              Ответить
              • Пояснение: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
                Ответить
        • Я один читаю mustform как mushroom?
          Ответить
    • какой же код дерьмовый) ужас)
      Ответить
      • >дерьмовый ужас
        Вот как точно и ёмко одной фразой описал ECMAScript!
        Ответить

    Добавить комментарий