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

    +1

    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
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    <script>
            window["flags"] = {
            "purcTOFlag": "true" == "true" ? true : false,
            "ENBL_CANCEL_POLICY": "true" == "true" ? true : false,
            "ENBL_BACKUP_CHECK_OLD_DEVICES": "false" == "true" ? true : false,
            "ENBL_DIRECT_ACCESS_LINKS": "true" == "true" ? true : false,
            "ENBL_NEW_ABG_URL": "true" == "true" ? true : false,
            "cr_9839666": "true" == "true" ? true : false,
            "cubaCRFlag": "true" == "true" ? true : false,
            "cubaMultiCityCRFlag": "true" == "true" ? true : false,
            "youthCRFlag": "true" == "true" ? true : false,
            "ENABLE_AFOP_MODE": "true" == "true" ? true : false,
            "SHARE_ITINERARY_ON_FACEBOOK": "false" == "true" ? true : false,
            "cr_11668201": "true" == "true" ? true : false,
            "hotelCRFlag": "true" == "true" ? true : false,
            "cr_adoshareitinerary": "false" == "true" ? true : false,
            "ROUNDOFF_AMOUNT_FOR_US_EDITION": "true" == "true" ? true : false,
            "hideSeatPromotionalBanner": "true" == "true" ? true : false,
            "enablePremiumRougeCR": "true" == "true" ? true : false,
            "availFareSplit": "true" == "true" ? true : false,
            "improvedMixedCabin": "true" == "true" ? true : false,
            "adoPassengerPrepopulate": "true" == "true" ? true : false,
            "adoIataInformation": "true" == "true" ? true : false,
            "premiumRougeSeatSelection": "true" == "true" ? true : false,
            "displayIntlTerminal": "true" == "true" ? true : false,
            "continueDisabledLightboxIsEnabled": "true" == "true" ? true : false,
            "createAeroplanFromConf": "true" == "true" ? true : false,
            "contOnAvailPage": "true" == "true" ? true : false,
            "alpiSpecialAssistanceCRFlag": "true" == "true" ? true : false,
            "removePaxTitle": "false" == "true" ? true : false,
            "perDiemInsurance": "true" == "true" ? true : false,
            "isVisaCheckoutEnabled": "true" == "true" ? true : false,
            "isCashRewardEnabled": "true" == "true" ? true : false,
            "masterPassCRFlag": "true" == "true" ? true : false,
            "masterPassAllowedEdition": "CA\-en:CA\-fr:CA\-zh",
            "youthphase2CRFlag": "true" == "true" ? true : false,
            "isCitylistPerfEnabled": "true" == "true" ? true : false,
            "isSingleTravelOptionEnabled": "false" == "true" ? true : false,
            "retainPaymentInformation": "true" == "true" ? true : false,
            "hotelChildAgeCR": "true" == "true" ? true : false,
            "displayGeoFirst": "true" == "true" ? true : false,
            "displayDiscAvail": "true" == "true" ? true : false,
            "premiumRougeUpsell": "true" == "true" ? true : false,
            "enableReplaceOpinionLabs": "true" == "true" ? true : false,
            "displayOalRef": "true" == "true" ? true : false,
            "newTravelOptionsLayoutFlag": "true" == "true" ? true : false,
            "hotelWidgetAPI": "true" == "true" ? true : false,
            "enableCombinedPhoneNo": "true" == "true" ? true : false,
            "hideTripSummaryForMobile": "true" == "true" ? true : false,
            "enableSecureAttribute": "true" == "true" ? true : false,
            "enhancedPreviewSeatMap": "true" == "true" ? true : false,
            "enhancedSeatMap": "true" == "true" ? true : false,
            "firstClassCabinCR": "true" == "true" ? true : false,
             .
             .
    }

    Taken from aircanada.com. Enjoy!

    Запостил: devfromhell, 31 Мая 2019

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

    • "masterPassAllowedEdition": "CA\-en:CA\-fr:CA\-zh",

      Лишнее
      Ответить
    • чем null отличается от ундифайнд?
      почему typeof нула objct?!
      почему typeof alertа function а моей функции object?

      почему жопасркипт такое неконсистентное уебское говнише? почему на этом говнище пишут?

      почему люди всегда выбирают максимально хуевый инсрумент?
      Ответить
      • typeof твоей функции - функция

        если бы браузер поддерживал <script language=php>, писали бы на нем тоже, поэтому не спрашивай хуйню
        Ответить
        • а про остальное чо скажешь?
          Ответить
          • Про лулл и ундефинед, typeof null согласен - сам не знаю. Спроси у 1023.

            Про максимально хуёвый инструмент - это ты про что?
            Ответить
            • 1. Чем null отличается от undefined? undefined используется, когда переменной не было присвоено никакое другое значение.

              var a; // переменной не присвоено никакое значение
              a = 5; // теперь присвоено
              a = undefined; // возвратили первоначальное состояние


              null является примитивным значением, которое представляет отсутствие объекта. Например метод match класса String в случае, когда строка не подходит под регулярное выражение возвращает null вместо массива.
              Ответить
              • Благодарю Вас за столь подробный ответ.
                Однако же из него можно сделать вывод что разницы между неопределенной переменной и переменной со значением undefined нет.

                Поясните тогда такой код:

                "use strict";                                
                const foo = {bar:undefined};         
                console.warn("bar" in foo);  
                console.warn("baz" in foo);


                Выходит что разница между отсутствием чего либо и undefined все таки есть.
                Ответить
                • Необъявленная переменная...
                  if("a" in window)
                      console.log("variable 'a' is declared");
                  else
                      console.log("variable 'a' is not declared");


                  Объявленная переменная с неопределённым значением...
                  var a;
                  
                  if(a === undefined)
                      console.log("variable 'a' has undefined value");
                  else
                      console.log("variable 'a' has value:", a);
                  Ответить
                  • как проверить первый случай в node, без глобального объекта?

                    Почему вы пишете var вместо let?
                    Ответить
                    • Глобальный объект в node.js тоже есть: global.

                      Потому что var может быть объявлено несколько раз, что удобно в консоли. Ну или блочная видимость...
                      {
                          let a;
                      
                          if(a === undefined)
                              console.log("variable 'a' has undefined value");
                          else
                              console.log("variable 'a' has value:", a);
                      }
                      Ответить
                      • Вы неплохо знаете джаваскрипт.

                        Посоветуйте хороший туториал для тех, кто умеет писать на других языках (то-есть рассказывать что такое "переменная" мне не нужно) и кому лениво читать спецификацию

                        Я пока изучаю https://javascript.info , но может есть что-то лучше?
                        Ответить
                        • Присоединяюсь к вопросу. Я использую https://caniuse.com/, но чуть ли не в половине случаев он говорит, что для поддержки всех веб-браузеров мне придётся почитать Исаака Эммануиловича Бабеля.

                          С чего лучше начать: с «Конармии» или с «Одесских рассказов»?
                          Ответить
            • 2. почему typeof null === "object"?!
              Результат typeof берётся из следующей таблицы...
              ┌───────────────────┬─────────────┐
              │    Тип значения   │  Результат  │
              ├───────────────────┼─────────────┤
              │ Undefined         │ "undefined" │
              ├───────────────────┼─────────────┤
              │ Null              │ "object"    │
              ├───────────────────┼─────────────┤
              │ Boolean           │ "boolean"   │
              ├───────────────────┼─────────────┤
              │ Number            │ "number"    │
              ├───────────────────┼─────────────┤
              │ String            │ "string"    │
              ├───────────────────┼─────────────┤
              │ Symbol            │ "symbol"    │
              ├───────────────────┼─────────────┤
              │ Object (не реали- │ "object"    │
              │   зован [[Call]]) │             │
              ├───────────────────┼─────────────┤
              │ Object (реализо-  │ "function"  │
              │   ван [[Call]])   │             │
              └───────────────────┴─────────────┘
              Есть причина, по которой оно так работало в первой версии JS. Во всяком случае null, также как и undefined, является единственным значением, и вы можете его сравнить напрямую. (object != null)

              И уже после проверки наличия объекта, вы можете посмотреть на его тип (object.constructor) или проверить наследование (например, object instanceof HTMLButtonElement).

              typeof необходим только для того, чтобы проверить примитивы: строки, числа, булевы значения и символы. Если вас объект интересует именно как объект, а не примитив, то вам достаточно проверить его на равенство null.

              Консистентность при работе с типами, как вы увидели, есть: сначала вы проверяете наличие объекта (object != null), а затем смотрите его тип (object.constructor).
              Ответить
      • Где-то тут мне недавно поясняли, что null — это такой специальный объект, семантически обозначающий что-то вроде «тут мог бы быть ваш настоящий объект, но его сейчас нет». А undefined — это просто хуй пойми что.
        Ответить
        • именнопо этому

          null == undefined
          да?

          давайе уже признаем что это поебота появилась по причине долбоебизма тех говноедов которые высрали этот больной язык

          место джаваскрипта рядом с брейнфаком
          Ответить
          • Именно поэтому я против «JavaScript».
            Ответить
          • А вообще это всё потому, что авторы «JavaScript» не осилили исключения и/или статическую типизацию. Вот, к примеру, есть у нас объект «baba», мы пытаемся обратиться к полю «baba.hui». В хороших языках мы получим ошибку компиляции, в нормальных — какой-нибудь KeyError. А в «JavaScript» решили возвращать какое-нибудь особое значение, обозначающее, что такого поля нет. «Null» возвратить нельзя, потому что это вполне себе валидное значение для поля (а вдруг хуй просто отрезали?), поэтому сделаем ещё одно специальное значение — undefined.
            Говноеды, короче.
            Ответить
            • undefined тоже валидное значение поля
              Ответить
              • Но мы никак не можем различить поле, которому присвоили значение «undefined», и простое отсутствие этого поля — то есть валидным значением «undefined» всё же не является, а конструкция «obj.hui = undefined» эквивалентна удалению хуя.

                Авторы «JavaScript» могли бы упороться и ввести бесконечно-расширяемый (в условиях интов авотхуй, в жс флоаты) метатип «undefined^N», где N — целое число. Тогда в каждом объекте нужно хранить максимальную степень неопределённости его полей, и если для какого-то поля она выше максимальной — значит, этого поля и вовсе нет, а если ниже — значит, его намеренно присвоили. И чтобы чётные степени undefined'а были равны друг другу и null-у, а нечётные — равны друг другу, но не равны чётным и null.[/color]
                Ответить
                • Нет.
                  let a = {guest: 1, gost: 2, hui: 3};
                  let b = {guest: 1, gost: 2, hui: 3};
                  a.hui = undefined;
                  delete b.hui;
                  print(Object.keys(a));//guest,gost,hui
                  print(Object.keys(b));//guest,gost
                  Ответить
                  • Ты прав, но проверять поля так неправильно
                    const a = {b:3}
                    Object.defineProperty(a, 'c', {value:3})
                    Object.keys(a)// ==>["b"]

                    Если надо проверить, то лучше так:
                    'b' in a
                    a.hasOwnProperty('b')
                    Ответить
                    • const a = {b: 1, hasOwnProperty: "hui"};
                      a.hasOwnProperty('b')
                      Ответить
                      • Если есть подозрения что твои коллеги будут заниматься такой хуйней, придется сделать отдельную функцию:
                        function hasProp(obj, prop){
                        	return ({}).hasOwnProperty.call(obj, prop)
                        }
                        hasProp(a, 'c') // false
                        hasProp(a, 'hasOwnProperty')// true
                        Ответить
                        • На сколько безопасно хранить пользовательские данные в ключах?
                          Ответить
                          • Вообще нихуя не безопасно. С другой стороны https://www.zdnet.com/article/over-100000-github-repos-have-leaked-api-or-cryptographic-keys/
                            Ответить
                            • Я про ключи объекта. Например, если использовать объект как "map", куда складывать юзернеймы, то код юзающий hasOwnProperty упадёт после регистрации пользователя "hasOwnProperty". Может есть какие-то ещё кейсы.
                              Ответить
                              • Приведи пример, не понимаю о чем ты
                                Ответить
                              • Код, который я привел с вызовом через прототип объекта - это популярное решение, я его видел в репозиториях google.
                                Можешь еще сделать так:
                                // создадим объект без прототипа, чтобы никто в оператор in не насрал
                                const a = Object.create(null)
                                'hasOwnProperty' in a // false

                                А вообще если тебе нужен map - используй es6 Map
                                Ответить
                                • Через ргототуре вызывай
                                  Ответить
                                • >А вообще если тебе нужен map - используй es6 Map


                                  Которого нет без Исаака Бабеля



                                  Понимаете теперь почему я считают джаваскрипт гноем?


                                  Такие простые вещи как ассоциативный массив (он же карта он же дикт он же словарь он же хеш) нем изначально ПОНОСНО СЛОМАНЫ

                                  В жопаскрипте сломаны даже работы с типами (см нул и ундифинед)

                                  САМЫЕ ОСНОВЫ языка СЛОМАНЫ



                                  блядь это как если ты береш автомабиль а там квадратный руль
                                  Ответить
                                  • Map является объектом встроенным в ядро JavaScript, Babel тут не причём.

                                    В чём поломка? Реализован интерфейс итератора, чтение, запись, проверка.

                                    null и undefined не являются экземплярами никаких классов, они являются примитивами.

                                    undefined является свойством глобального объекта.

                                    Его значение может быть получено из void {};

                                    Это примитивное значение используется, когда переменной не было присвоено никакое значение.

                                    null является примитивным значением, которое представляет отсутствие значения объекта.
                                    Ответить
                                    • >Map является объектом встроенным в ядро JavaScript, Babel тут не причём.


                                      Да, но разве доступен он, скажем, в IE 11?

                                      >null и undefined не являются экземплярами никаких классов, они являются примитивами.

                                      В таком случае почему же тип nullа -- object?
                                      Ответить
                                      • > почему тип нулла объект
                                        Так получилось в первой реализации, скорее всего. Представь, что ты запиливаешь сишную структуру под жс значения. Скорее всего у тебя там будет енум с типом и юнион из дабла и поинтера. И этот самый поинтер юзается только для объектов. Видимо так и родился нулл с типом объект. А undefined - это уже отдельное значение енума.
                                        Ответить
                                      • Разумеется если вы возьмёте старый движок, то там не будет реализации нового стандарта. Во всяком случае Map есть в движке IE 11. (https://i.imgur.com/bVFTce0.png)

                                        Проверка на null производится так: object != null.

                                        А typeof null === "object" существует по историческим причинам, вам это не нужно. (http://2ality.com/2013/10/typeof-null.html)
                                        Ответить
                      • Именно поэтому я против джаваскриптовских «словарей». Это ж надо было, блядь, такую хуйню придумать!
                        Ответить
                        • А за что ты?
                          Ответить
                          • За «dict».
                            Ответить
                            • В «PHP» нет ни джаваскриптовских «словарей», ни «dict». Именно поэтому я за «PHP».
                              Ответить
                              • Куда пропал Rooster?
                                Ответить
                              • Есть.
                                $dzheison = json_decode('{
                                    "bormand": "SELECT id FROM huis",
                                    "guest": "SELECT * FROM prodzhi"
                                }');
                                Ответить
                              • там есть оссоциоивной моссив

                                но вообще пых язык для пидаров

                                язык для нормальных пацанов имел бы отдльный тип данных (как в руби перле или жве или сишарпе или обжс)
                                Ответить
                                • В итоге элемент пэхапэшного массива имеет числовой индекс и опциональный строковый ключ. Выглядит, как будто к обычному массиву с числовыми индексами рядом пристроили табличку строковых ключей.

                                  Можно индексировать массивы и так, и эдак, и течь.
                                  Ответить
                                  • вот именно по этому я за луа
                                    там это блядство хотя-бы официально)
                                    Ответить
                                    • Угу. В «PHP» нет прямого доступа к этой секретной табличке. Что-то сделать с индексами можно либо стандартными функциями, либо через расширения.
                                      Ответить
                                      • кому вообще в больной мозг пришла мысль НЕ ДЕЛАТЬ РАЗНИЦЫ мжду массивами/списками и хешами/диктами/мапами?
                                        Ответить
                                        • В другом известном языке до недавних пор вообще писали:
                                          var MyClass = new Function('foo', 'this.name = foo;');
                                          MyClass.prototype.baz = 'quux';
                                          var MyObject = new MyClass('bar');

                                          Здорово, правда?
                                          Ответить
                                          • и кудахтали при этом что этот вырвиглазный пиздец это прототипориентированное ООП и типа круто
                                            Ответить
                                          • Еще охуенное нашел.

                                            Методы у числа вызываются через две точки.

                                            22..toString(16);
                                            У всего остального -- через одну
                                            Ответить
                                            • Первая точка к самому числу относится.
                                              Ответить
                                              • В смысле?

                                                Почему в C# или в Ruby у меня такой проблемы нет?
                                                Ответить
                                                • Ну значит у них более сложный парсер. А в жс тупо парсер числа съедает точку.
                                                  Ответить
                                                  • да, он думает что это часть плавуна
                                                    только я думаю это скорее даже лексер
                                                    лечица вот так

                                                    Number(0.12).toFixed(1)
                                                    или даже так
                                                    (200).toString(16)
                                                    Ответить
                                                  • 0x16.toString(10);
                                                    Ответить
                                            • Ну так это десятичное число...
                                              22.0.toString(16);
                                              0x16.toString(10);
                                              0b101000110.toString(16);
                                              0o170.toString(16);


                                              Хотя обычно число хранится в переменной...
                                              Ответить
                                              • > Хотя обычно число хранится в переменной...
                                                Я иногда так коллбэки передаю, правда в питоне:
                                                map((5).__mul__, arr)
                                                Ответить
                                                • ОК... буду знать! ☣️☢️☠️
                                                  Ответить
                                                  • Тест: ☣️☢️☠️

                                                    Неужели теперь работает?
                                                    Ответить
                                                    • Неработает. Только малая часть. Попытался какашкой и луёй.
                                                      Ответить
                                                      • Я заметил, что работают только символами с кодпоинтом U+XXXX, то бишь меньше 2^32. А вот от какашки, у которой U+1F4A9, ГК плюётся. Видимо, где-то внутри используется «UTF-16», а суррогатные пары не осилены. Какой Unicode )))
                                                        Ответить
                                                        • В «MySQL» есть кодировки «utf8» и «utf8mb4». Очевидно же, для чего они предназначены?

                                                          Если вдруг кто-то не знает, то сообщу, что кодировка «utf8» предназначена для кодирования символов, которые в «UTF-8» занимают не более трёх байтиков. Это символы с кодпоинтами меньше 2^32. Сразу можно догадаться по названию, не правда ли?

                                                          Кодировка же «utf8mb4» предназначена для кодирования символов, которые в «UTF-8» занимают не более четырёх байтиков. Это символы вплоть до U+10FFFF.

                                                          Неопытные мускулобляди выбирают кодировку «utf8» и теряют возможность сохранять символы с кодпоинтами от 2^32.
                                                          Ответить
                                                          • Ну вот. Умные люди задались благой целью: сделать Единую Кодировку, в которую входят вообще все символы письменности, чтобы избавиться от кошмарного восьмибитного наследия с его ФСРЙХЛХ Р╦ЛМШЛХ ГЮЙКХМЮМХЪЛХ. И всё хорошо: создали, избавились… но теперь вместо КОИ-8, CP-1251, ISO 8859-5 приходится ебаться с utf-8, utf-16, utf-32, последние два с BOM, без BOM, HE, LE и всё это в самых безумных сочетаниях с самыми безумными ограничениями и архитектурами (суррогатные пары — ёбанный пиздец). А конечное ПО только подливает масла в этот адский котёл, правильно поддерживая только треть стандарта, от другой трети крашась, а от последней генерируя совершенно неадекватные результаты.
                                                            Ответить
                                                            • uMeHHo noemoMy 9l 3a "ASCII".
                                                              Ответить
                                                              • x...x.x...x.xxxxx.x...x.x...x...x........
                                                                x...x.xx.xx.x.....x...x.x...x..x.x.......
                                                                x...x.x.x.x.x.....x...x.x...x.x...x......
                                                                x..xx.x...x.xxxx..xxxxx.xxxxx.x...x......
                                                                x.x.x.x...x.x.....x...x.x...x.x...x......
                                                                xx..x.x...x.x.....x...x.x...x..x.x.......
                                                                x...x.x...x.xxxxx.x...x.x...x...x........
                                                                .........................................
                                                                .........................................
                                                                .........................................
                                                                xxxxx...x....xx...xxxxx...x...x...x.x...x
                                                                x...x..x.x..x..x....x....x.x..xx.xx.x...x
                                                                x...x.x...x.....x...x...x...x.x.x.x..x..x
                                                                x...x.x...x..xxxx...x...x...x.x...x...x.x
                                                                x...x.x...x.....x...x...x...x.x...x....x.
                                                                x...x..x.x..x..x....x....x.x..x...x...x..
                                                                x...x...x....xx.....x.....x...x...x.xx...
                                                                Ответить
                                                            • > единую кодировку
                                                              Вавилонская башня 2.0
                                                              Ответить
                                                    • Вы про VARIATION SELECTOR-16?
                                                      Ответить
                                          • Имена представителей класса пишут обычно маленькими буквами.
                                            Ответить
                  • Хм, верно. Ну тогда см. второй абзац.
                    Ответить
                  • Похоже на луа, но в обоях случаях будет guest,gost
                    по этому я за луа.
                    Ответить
          • Нi, ты объекты и примитивы путаешь.
            Ответить
        • undefined используется, когда переменной не было присвоено никакое другое значение.

          var a; // переменной не присвоено никакое значение
          a = 5; // теперь присвоено
          a = undefined; // возвратили первоначальное состояние


          null является примитивным значением, которое представляет отсутствие объекта. Например метод match класса String в случае, когда строка не подходит под регулярное выражение возвращает null вместо массива.
          Ответить
      • https://youtu.be/ZCauftQOj88?t=1392
        Ответить
    • ебанутый язык
      почему toString это функция а Symbol.toPrimitive это символ??
      Ответить
      • О, боже! Расскажи нам ещё о странностях Javascript!
        Ответить
        • на жаваскрипте пишут жалкие неудачники
          их выбор языка лишь забавляет меня
          Ответить
          • Вы можете написать свой собственный язык...

            Использование ECMAScript выходит за рамки простого языка скриптов, он используется для полного спектра задач программирования во многих различных средах. ECMAScript является полнофункциональным языком программирования общего назначения.
            Ответить
      • Symbol.toPrimitive используется, чтобы указать как какой-то объект привести к примитиву, зависящему от контекста в котором он находится! Т. е. вам нужно на своём объекте, который вы хотите сделать приводимым к примитиву, объявить метод с таким вычисленным именем.

        А метод toString объявлен в классе Object и возвращает какое-либо текстовое представление объекта.
        Ответить
        • почему же Symbol.toPrimitive а не просто toPrimitive ?
          Ответить
          • А почему статическое свойство должно болтаться где-то отдельно в глобальном объекте?

            Рассмотрите пример...
            class Vector3 {
            	constructor(x, y, z) {
            		Object.assign(this, { x, y, z });
            	}
            
            	static get zero() {
            		return new Vector3(0, 0, 0);
            	}
            
            	static get one() {
            		return new Vector3(1, 1, 1);
            	}
            }


            Вы можете получить определённые экземпляры вектора так: Vector3.zero, Vector3.one.

            Таким же образом получаются определённые экземпляры класса Symbol.
            Ответить
    • https://panchul.livejournal.com/592952.html
      Ответить
    • if (~str.indexOf("Widget")) {
        alert( 'Found it!' ); // works
      }

      байтомагия в моем жабоскрипте
      Ответить
      • А зачем вам вычислять позицию в строке, когда вы по сути только хотите проверить наличие подстроки!
        if(str.includes("Widget")) {
            alert('Found it!"); // works
        }
        Ответить
        • Петух, строка, погода.
          Ответить
          • Кок! Строка, городской округ Алапаевское, Восточный управленческий округ, Свердловская область, Уральский федеральный округ, РФ. 8 градусов тепла. Слабый дождь.
            Ответить

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