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

    +127

    1. 1
    ['10','10','10','10'].map(parseInt)

    Результат:

    [10, NaN, 2, 3]

    Запостил: someone, 22 Сентября 2014

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

    • Отгадка:

      // Рассмотрим пример:
      ['1', '2', '3'].map(parseInt);
      // Хотя ожидаемый результат вызова равен [1, 2, 3],
      // в действительности получаем [1, NaN, NaN]

      // Функция parseInt часто используется с одним аргументом, но она принимает два.
      // Первый аргумент является выражением, а второй - основанием системы счисления.
      // В функцию callback Array.prototype.map передаёт 3 аргумента:
      // элемент, его индекс и сам массив.
      // Третий аргумент игнорируется parseInt, но не второй, следовательно,
      // возможна путаница. Смотрите запись в блоге для дополнительной информации.

      function returnInt(element) {
      return parseInt(element, 10);
      }

      ['1', '2', '3'].map(returnInt);
      // Результатом является массив чисел (как и ожидалось)

      // Простейший способ добиться вышеозначенного поведения и избежать чувства "чё за!?":
      ['1', '2', '3'].map(Number); // [1, 2, 3]
      Ответить
      • А с underscore ещё можно вот так: http://jsbin.com/jimazodofare/1/

        Вот видите, не доводит до добра ваша непонятная функциональщина.
        Ответить
        • функциональщина + динамизм с опциональными параметрами = путь в ад

          В хачкеле таких проблем нет.
          Ответить
          • Подумаешь, проблема. Всего-то написать обёртку... Даже в божественной сишечке не составит труда обернуть все нужные функции!
            Ответить
            • Как ни странно - проблема.
              Во-первых: а зачем такой дизайн у стандартных функций? Мне вот за всю жизнь ни разу не пригодились эти дополнительные параметры, только крови попортили.
              Во-вторых: фреймвокри существуют, но всилу ограниченности авторов фреймворков, обычно там дизайн такой же херовый. В подчерке, ж.квери, прототипе и т.п. вечно сделано через жопу. Гораздо логичнее было бы:
              1. Не делать эти функции методами объектов (если уж это метод, то за каким туда передается this еще раз, третим параметром?). Таким образом их можно будет вменяемо компоновать.
              2. Коллекции, по которым можно применять map / filter / reduce должны имплементить какой-нибудь итератор или другой механизм, который бы сделал map / filter / reduce расширяемыми для новых коллекций.
              3. Передавать функцию работающую с элементами коллекции первым аргументом и потом одну или больше коллекций. Это позволяет обрабатывать табличные данные легко, например, да и вообще есть много полезных вариантов использования.
              Ответить
        • Ссылка съелась, должно быть: http://jsbin.com/jimazodofare/1/edit?js,output
          Ответить
        • Это не наша функциональщина, это ваши невнятные функции
          Ответить
      • А у меня в одну строку всё работает.
        ['10','10','10','10'].map(function(x){return parseInt(x)})
        Ответить
    • А давайте в качестве колбеков будем пихать все функции, которые только вспомним. Вот весело будет!
      Ответить
      • хи-хи, хи-хи.
        Ответить
        • ['10','10','10','10'].map(toString)
          Или так:
          ['10','10','10','10'].map(alert)
          Или даже так:
          ['10','10','10','10'].map(window.open)
          Ответить
          • >['1', '2', '3'].map(toString);
            >["[object Undefined]", "[object Undefined]", "[object Undefined]"]

            ['1', '2', '3'].map(String);
            ["1", "2", "3"]
            Ответить
            • Интересно. В Firefox toString() и window.toString() даёт разные результаты ("[object Undefined]" и "[object Window]"), а Chrome - одинаковые. На valueOf() оба ругаются, по window.valueOf() возвращают window.
              Ответить
              • Странно это. Другие методы (valueOf, hasOwnProperty) задыхаются от недостатка объекта, а toString преспокойненько говорит о Window. Видимо, в хроме кто-то решил оптимизировать window.toString.
                Ответить
                • Не могу повторить.

                  ['1', '2', '3'].map(valueOf);
                  [DOMWindow, DOMWindow, DOMWindow]
                  ['1', '2', '3'].map(hasOwnProperty);
                  [false, false, false]
                  7-й хром.

                  >В Firefox toString() и window.toString() даёт разные результаты
                  У меня одинаковые.
                  Ответить
                  • Последний из могикан на такой запрос отвечает:
                    Unhandled Error: Cannot convert undefined or null to Object
                    Ответить
                • 17, 27 работают так, как сказано, да.

                  >Видимо, в хроме кто-то решил оптимизировать window.toString.
                  Это не оптимизация, это регрессия.
                  Ответить
                  • TypeError: Cannot convert undefined or null to object (на valueOf)
                    Chromium 37.0.2048.0 (прошу прощения, то был не совсем Chrome)

                    Firefox 32.0.2
                    Ответить
                • Чем является this при вызове функции не из контекста? В обычном режиме - глобальный объект - window, в strict mode - undefined. Методы типа valueOf или hasOwnProperty делают преобразование ToObject, которое кидает ошибку на null и undefined. toString вместо этого возвращает внутренний [[Class]] this.
                  Ответить
                  • Так хром придерживается какой-то третьей вореции.
                    Лисье "[object Undefined]" вместе с исключением по valueOf() логично и объяснимо. А хромое "[object Window]" вместе с исключением по valueOf() - бред какой-то.
                    Ответить
                    • По toString, а не по valueOf :) Говорю же, это просто значит, что если метод Object.prototype.toString возвращает "[object Undefined]" - он определен в strict mode, а "[object Window]" - нет.
                      Ответить
                      • А, понял Вас. Однако, весёлый ход.
                        Ответить
                        • я зашел в пост чисто посмотреть к кому это ты на Вы обращаешься
                          Ответить
                          • Ко всем.
                            Ответить
                            • g@@@@@44444*********9444@@@@@@@@@@@Mggg__
                              	       g@M"	    _an**"""""""**Vw=G______"%%@@@@@gg_
                              	     ,@@`	 a^"  __a=~v-vvv~~,___	       _____`"*@gg_
                              	    a@@       _M" _m*"` _______     `""""""""""`    "	"9@g_
                              	    @@	    a" ,m"_ar*"'`     -,	 ,amv****-~,	   9@g
                              	   @@	     .* u"		C	  ,~	    "\	     @
                              	  d@	       '    __gg____		  `		     @y
                              	 g@		,g@@@@@@@@4@@gg_	  C   ______	     9@g
                                     g@@.>~.	   __  a@""@@@@@@__  "9@g	  ,g@@@@**4@@_	      "@g_
                                   g@"$-*"""	   *Y, @@@@*""**4@@@g__$@C     ggg@@@@@@@@@@*" "'" ""Mg`8@g
                                 g@",`  ,g@@@@@@@g_	    _g@     ""@M"      `"@@"		    *n_"C"@@
                                g@'	 p@"	,`"@@@ggggg@@"			 8]	 ,_  _gM@@@@g ' 'C8@
                                @@	j@     8@_    `"""'			 8@g_	 3@g@@@`,  `"	 ][@
                                @L	8@  _g@@@@@gg_		    _gMMy	  "9@g_    `""' 8L	 j8@
                                @k	3@ d@@@@   "@@@gg_   *""""" @"``___	    '@@g_	@@C  n"  Q@
                                "@C $  9k    @@_    "8@@@@gg_     @g_fM4@@M	   g@""" "n.   a@@@  _m*3@"
                                 "@g N,      9@@gg_  8@ `""9@@@gg__"	       8gg@M	    _g@@@d@k   a@%
                                  "@@g_'	"@@@@@@@@g_	`"8@@@@ggg____  ""`   ___gg@@@@ 8@@@   @@
                                    "@g_	 '@g `"@@@@gg__   @L  `"""4@@@@@@@@@@@@@@@@"  @C @@@  3@
                              	9@_	  `@g  3@"9@@@@@@g@	   [@	  @@	 4@y  @kg@@@  [@
                              	 9@	    8@gd@   '"9@@@@@@@gggggd@gggggd@gggggg@W@@@@@@@@  [@
                              	  8g	     "@@g	 @""9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F  [@
                              	   @g	       "@@g_	d@     '""@@@@@@@@@@@@@@@@@@@@@@@$@   3@
                              	   `@g_		 "@@@g_j@'	  @C  ``"3@@"""8@""j@'j@g@@   3@
                              	     9@g_ ~__ ~._  `"@@@@g_	  @C	 8@   g@^ p@^ "@@M     @C
                              	       "@@g "9m_ "Nq_  "*@@@@ggggg@______@____@@gg@@@@@M"      @L
                              		 "9@@g_`"Mm_`"Nq_   """"*4@@@@@@@@@@M@@4*"""'	       8k
                              		    "9@@g_ ""Mm_"*w__	    ~~~~ aaa~~	      _/       $@
                              		       `"@@gg_  "*WG_"*w~.____		___am*"    /   [@
                              			   "*@@gg    `"*-~<.__	       `       __M"    3@
                              			       "9@gg_	      `""'** ------**""`       d@
                              				  `"@@ggggg__			     ,d@
                              				      ""9@@@@@gg__		  __g@"
                              					     `""*4@@@@MggggggggM@@@@"
                              						     `""""""""""'
                              Ответить
    • У меня такое было с [....].map(RegExp);
      (позже участок кода, уже исправленный, был отправлен в http://govnokod.ru/16651 из-за более тонкой ошибки)
      Ответить

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