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

    +156

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    var empty = true;
                _.each(records, function (val, key) {
                    if (records.hasOwnProperty(key)) {
                        empty = false;
                    }
    
                });

    изза того что в прототипы стандартных Object и Array напихали всяких методов типа .max .each приходится так проверять объект на пустоту)

    Запостил: nur, 16 Июля 2012

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

    • Интересно, проектировщики стандарта не думали о том, что кому-то понадобиться перечислять own properties или хотя бы проверять их отсутствие?

      Кстати, а почему используется each, а не обычный цикл for (var key in records)? Имхо в данном случае это только создает бесполезный оверхед.

      P.S. А что такое "_"?
      P.P.S Если это underscore.js, то там вроде бы есть _.isEmpty(object)...
      Ответить
      • underscore.js
        http://documentcloud.github.com/underscore/
        Ответить
        • Тогда вот:
          // Is a given array, string, or object empty?
          // An "empty" object has no enumerable own-properties.
          _.isEmpty = function(obj) {
              if (obj == null) return true;
              if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
              for (var key in obj) if (_.has(obj, key)) return false;
              return true;
          };

          Там есть готовый код для подобной проверки. И рассматриваемый говнокод превращается в красивое:
          var empty = _.isEmpty(records)
          Ответить
          • кстати да, видимо изза снх я запилил этот гк)
            Ответить
            • > снх
              Поясните, пожалуйста, что такое снх?
              Ответить
              • странная неведомая хуйня :)
                Ответить
                • А где тут НЁХСНХ? Реализация в isEmpty в underscore вполне вменяемая.

                  P.S. Вот начнут браузеры поддерживать ECMA 5, в которой есть Object.keys(obj), андерскоровцы добавят ее использование в свою либу - и весь код, использующий, isEmpty станет на порядок быстрее ;) А наговнокоженные велосипеды ими и останутся...
                  Ответить
                  • когда вылавливал этот баг, isEmpty как то странно отрабатывал, поэтому пришлось написать как есть, щас переделал на isEmpty и все корректно работает, вот поэтому это и снх)
                    Ответить
                    • Понятно. Ну гейзенбаги всегда доставляют ;)
                      Ответить
    • > в прототипы стандартных Object и Array напихали всяких методов типа .max .each
      Prototype?
      Ответить
      • Нет, на сколько я понимаю, автор имеет в виду то, что в Яваскрипте 1.3 можно было спокойно перебирать ключи хеша (он же Object или Array) не опасаясь наткнуться на их методы и свойства (хотя они же вроде и так защищены от перечисления, или это опять какой-то замечательный браузер решил сделать не как у всех?).

        Вобщем, судя по jslint'у за обычный for in есть предупреждение, за то, что перебираются не только ключи в этом хеше но и свойства объявленные на прототипе объекта.

        Аналогичная проблема существовала в AS2 но там изза того, что реализация была всего одна, можно было пользоваться нестандартной AsSetPropFlags(...) для того, чтобы убрать ключ-свойство из перечисления.
        Ответить
        • джаваскрипт такой джаваскрипт, что, если свойства добавлены к самому объекту, а не его прототипу, то спокойно можно по ним итерировать (тип, точнее, прототип будет function)
          Ответить
          • Хз, на первый взгляд свойства унаследованые от встроенных классов защищены от перечисления:
            function Parent() {}
            Parent.prototype.foo = 42;
            
            function Child(superclass) {
                this.__proto__ = superclass.prototype;
                this.bar = "this is bar";
            }
            
            var child = new Child(Parent);
            for (i in child) console.log("key(" + i + ") => value(" + child[i] + ")");
            
            child = new Child(Array);
            for (i in child) console.log("key(" + i + ") => value(" + child[i] + ")");

            (В первом случае видим foo в распечатке, во втором - length, map и т.д. отстутствуют в распечатке). Но очевидно есть какие-то особенные браузеры, где это работает по-другому. Хотя с другой стороны, на сколько я понимаю __proto__ никогда не было стандартом, и наверняка где-нибудь его нет вообще и в таком контексте опасения автора мне совсем не понятны. Но, опять же, с Явскриптом никогда не знаешь что пришло в голову разработчикам конкретной версии.
            Ответить
            • а почему this.__proto__ а не this.prototype?
              Ответить
              • Если так поступить, то у объекта Child будет свойство с именем prototype - обычно этого хочется избежать.
                Ответить
              • И вообще присваивание prototype - это просто создание свойства, это не управляет наследованием. Тут смысл в том, чтобы сымитировать наследование, а не просто создать какое-то дополнительное свойствo (с возможно зарезервированым именем).
                Ответить
                • вообще, "наследование", применительно к объектному языку, звучит, по мне, странно. не надо ООП тянуть в ОП
                  Ответить
                  • Как бы ни звучало, это именно то, что оно делает. Для этого и задумывалось. То, что идея не прижилась (да и вообще, хреновая идея), это уже как бы отдельный разговор.
                    Ответить
                    • просто, если реализация хромает - это яркий индикатор того, что и идея хренова.
                      если какой-то язык ругают (пхп не считаем) то это значит, что с ним обращаются не так, как это было в него заложено.
                      нередко беды возникают именно из-за того, что, переходя на другой язык, тянут привычки и навыки из старого.

                      заставьте, скажем, матерого, закоренелого сишника писать исключительно на каком-нибудь джаваскрипте, руби или вообще хаскелле - очень вероятно, будете наблюдать безудержное калоизвержение, матюконедержание и, возможно, прогрессирующую шизофрению...
                      Ответить
                      • Конкретно это свойство было добавлено в язык отцами основателями (Мозилой). Почему - надо у Брендона Ейка спрашивать, я понятия не имею. Говорят он любит Смолток, но если и он не любит Яваскрипт, то тогда как дальше жить?
                        Ответить
                        • ну, то, что оно есть, еще не значит, что его надо везде использовать.
                          на первый взгляд, автоматическое расширение объектов за счет прототипов звучит заманчиво, но нужно подумать - а надо ли это?
                          вон весь фреймворк PrototypeJS построен на этом, и почему же он потерял свою популярность? почитайте об этом.
                          Ответить
                      • UPDATE: Выглядит даже так, как будто БЕ очень даже активный сторонник и потворник: http://old.nabble.com/__proto__-and-JSON-td33931191.html совсем недавнее обсуждение, и, предполагается, что это войдет в стандарт ЕС5 (его же вроде уже приняли, или еще нет?)
                        Ответить

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