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

    −11

    1. 1
    +((!+[]+!![]+!![]+[])+(!+[]+!![]));

    Cloudflare.

    Запостил: 3_14dar, 08 Сентября 2015

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

    • Как оно работает?

      > !+[]+!![]+!![]
      3
      > !+[]+!![]+!![]+[]
      '3'
      > [] + true
      'true'
      > +[]
      0
      > !+[]
      true
      > [] + 2
      '2'
      Ответить
      • Работает оно за счёт приведения типов различными операторами.

        Например унарный плюс кастует свой аргумент в дабл.
        Ответить
        • А мой фаворит?
          > [] + true
          'true'
          Ответить
          • Фаворит также работает за счёт приведения типов различными операторами.
            Если оба операнда бинарного плюса - числа, результат становится числом. Иначе операнды обычно* приводятся к строке и результат становится строкой.
            __________
            * может и всегда, не помню
            Ответить
        • >унарный плюс кастует
          Только в js! Одушевленный оператор!
          Ответить
      • обьясните неучу, почему пустой массив кастится к пустой строке в случаях 2 + [] или true + []
        Ответить
        • Почему к пустой? Хз.
          Ответить
        • https://www.destroyallsoftware.com/talks/wat
          Ответить
        • Потому что непустой массив [1,2] кастится в строку "1,2". С пустым по аналогии получаем "".

          Бинарный плюс для числовых аргументов, емнип, работает как сложение, а для любых других (массивов, объектов и т.п.) - делает toString() и конкатенирует.
          Ответить
          • но почему именно строку он определяет как общий тип? почему не обьект или undefined
            Ответить
        • Потому что не определено других способов сложения числа и массива и булева и массива соответственно. А что то ему нужно делать, поэтому он кастит к наиболее общему типу - строка. Я прав?
          Ответить
          • Эксепшн, блеать, надо кидать в таких случаях. Совсем распустились эти языки.
            Ответить
            • Лучше управлять строгостью. Например, на уровне блока кода. Или предоставить решать сигнатуре функции, что делать с аргументами.
              Например,
              LOG('my test', 12 + []) // пройдёт
              sendMoney('USD', 12 + []) // упадёт
              Ответить
              • Ты же сам ебанёшься потом этот код отлаживать и поддерживать... В одном контексте код себя ведёт одним образом, в другом - совсем по-другому, причём неявно... Нахуй и впизду.
                Ответить
              • Тогда уж явную конструкцию "мнеПохуйНаРезультат":
                LOG('my test', мнеПохуйНаРезультат(12 + []));
                Ответить
                • Потом будет код, который парсит результат из логов.
                  Ответить
            • что поделаешь, после жабы смотрится ужасно. А теперь представь, что существует целая прослойка программистов, взращенная на экмаскрипте... Бууууу)
              Ответить
              • И на PHP. Там тоже такая идеология.
                Ответить
                • Там одно время даже инты в строки кастились при сравнении, я прав?
                  Ответить
                  • Строки в инты (и флоаты).

                    "3718273987129837981273987129312" == "3718273987129837981273987129313"
                    Ответить
                    • дружелюбный язык

                      Не удивительно, что в вебпрограммировании своя экосистема и свои законы
                      Ответить
                      • Забавно, что обитатели этой экосистемы считают это нормальным поведением.
                        Ответить
                        • Вспоминается шутка "Аристократы"
                          Ответить
                        • Это и есть нормально. Их же большинство...
                          Ответить
                      • наследие сишки с её слабой типизацей и неявными кастами
                        идея была принята и раскрыта
                        широко раскрыта, прям как гоатсе
                        Ответить
                        • > слабой типизацей и неявными кастами

                          А всё почему? Потому что не хотелось людям нормальную систему типов делать и потом касты кругом писать.
                          Ответить
                          • >> Потому что не хотелось людям нормальную систему типов делать и потом касты кругом писать.

                            Похуизм Экономьте буквы
                            Ответить
                        • Ну зато благодаря js и php остальные поняли, почему слабая типизация ненужна.
                          Ответить
                          • > Ну зато благодаря js и php остальные поняли, почему слабая типизация ненужна.
                            3_14dar, иди напитон, пидар!
                            Ответить
                        • У сишки как раз неявных кастов было немного. Число в строку и наоборот — только явно ручками. Даже флоаты в целые приходилось явно округлять.
                          Ответить
                          • >Число в строку и наоборот — только явно ручками.
                            Ну логично, т.к. число - тип-значение, а строка - указатель.
                            Ответить
                    • Более того, "0E1234" == "0E5678"
                      Ответить
                    • Enlarge your equality:

                      "3718273987129837981273987129312" === "3718273987129837981273987129313"
                      => false
                      Ответить
                  • Тот самый баг.
                    Ответить
    • Гы, jsfuck уже в продакшене юзают.
      Ответить
    • JS говно.
      Ответить
    • Что за хуйня этот питон?

      In [84]: re.split(r'(;)+', 'a;a;')
      Out[84]: ['a', ';', 'a', ';', '']


      Какого х ; попадают в список?
      Ответить
      • If capturing parentheses are used in pattern, then the text of all groups in the pattern are also returned as part of the resulting list.

        А доки читать так и не научили.
        Ответить
        • Тогда второй вопрос: как это сделать нормально, если в скобках не строка, а именно регулярка?

          >capturing parentheses
          А бывают незахватывающие скобки? Мне они кагбэ нужны чтобы указать к чему относится +.
          Ответить
          • > А бывают незахватывающие скобки?
            Бывают - (?:)
            >>> re.split('(?:;)+', 'a;a;')
            ['a', 'a', '']
            Ответить
      • 3_14dar, иди напитон, питон!
        Ответить
    • Тут должна быть ссылка на http://xkcd.com/1537/
      Ответить

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