Ответы пользователя по тегу JavaScript
  • Если Ajax не прислал ответ?

    kurtov
    @kurtov
    Изучите документацию по API, многие публичные API имеют Rate Limit. Например gihub в ответе содержит спец заголовки по которым можно рассчитать время следующего запроса. Если игнорировать эти заголовки и продолжать "бомбить" API запросами, то могут и заблокировать.
    Ответ написан
    Комментировать
  • Как оптимизировать отображение изображений canvas?

    kurtov
    @kurtov
    Когда хотят что то быстрое на канвасе, как правило упоминают requestAnimationFrame и WebGL. А с использованием стороней либы решать такие задачи можно быстро и легко. Например pixi.js
    Ответ написан
    Комментировать
  • Three.js как использовать физику?

    kurtov
    @kurtov
    Отсутствие документации, примеры для старых версий и другие недостатки Three.js привели к тому что ушли на BABYLON.js. Менеджера проекта убедила следующая подборка
    Кратко:
    • THREE - нужна красивая анимация на одной странице типа лэндинга
    • BABYLON - нужна 3д игра
    Ответ написан
    Комментировать
  • Объясните как работает код?

    kurtov
    @kurtov
    Article.count и this.count находятся на разных уровнях цепочки прототипов
    Если вам знакомо ООП из других языков, то Article.count - статическое свойство класса.
    new Article() создает новый объект, если вы добавите this.count = 1 внутрь конструктора, то
    function Article() {
      this.count = 111;
      Article.count = 222;
    }
    
    conts article1 = new Article();
    
    console.log(Article.count); // 222
    console.log(article1.count); // 111
    console.log(article1.__proto__.constructor.count); // 222 - вот он как глубоко
    Ответ написан
    4 комментария
  • Как научиться писать приложения на pure JS?

    kurtov
    @kurtov
    А зачем?
    Зашел на upwork:
    по запросу 'pure javascript' выдает 50+ вакансий, из которых только <20 имеется в виду чистый js
    запрос по 'javascript' выдает 11k+

    Не хочется использовать что то не зная как все устроено под капотом.


    Загляните под капот. Это самый быстрый и надежный способ при самостоятельном обучении. Как правило js проекты в открытом доступе на github
    Ответ написан
    Комментировать
  • Почему new Date().toISOString() теряет значение временной зоны?

    kurtov
    @kurtov
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

    Функция всегда возвращает время в часовом поясе UTC, Z в конце означает UTC
    Ответ написан
  • Правильно ли сравнивать генераторы, промисы и async/await?

    kurtov
    @kurtov
    Сначала были Промисы и девелопер понял что это хорошо. Но девелопер задумался, а можно ли перестать писать then().then()... Но async\await еще не было, тогда девелопер взял функцию генератор смешал с промисом и родилось - co Это выглядело немного страшненько (имхо), но хайп был, который наплодил много статей почему это спасение - порой слог был такой уверенный, что вводил в заблуждение. А потом появились async\await - которые промисы, но без then().then().

    Промисы это промисы, их надо понять в любом случае. Зная промисы, async\await понимается быстро и полностью.
    Генераторы (то что вы имеете в виду) это самописный сахар для реализации async\await подобного поведения до того как появился async\await. Т.е. это не реализация языка, а просто код обертка.
    Async\await - это уже реализация языка, которая основана на промисах.
    Ответ написан
    2 комментария
  • Как проще всего получить элемент из коллекции Set/Map?

    kurtov
    @kurtov
    Мы используем такой вариант: если в браузере нет поддержки какой то фичи, то подключается полифил. Детектим фичи, а не браузер. Как результат код на месте чист и без условий, соответственно в современных браузерах всё быстро и оптимально. Полифилы это не производительно, но это выбор юзера - пусть один и страдает.

    Конкретно по вашему вопросу. Я бы добавил дополнительно "тип" по которому определять тип коллекции. Например вторым параметром, если это сложно (например для промисов) то передавать объект {type: 'type', collection: 'Set'}
    Ответ написан
  • Какая разница между патернами?

    kurtov
    @kurtov
    Во втором случае вызовы
    var App1 = new App();
    var App2 = new App();
    создадут два разных объекта.
    Первый случай гарантирует что на странице будет только один App.
    Также есть разница в производительности, т.к. прямой вызов метода быстрее, чем поиск и вызов в прототипе - разница очень мала, но в критических местах может быть ощутимой
    $(function(){
    
      // Для первого способа можно изменять объект, зная что эти изменения видны всем
      App.prop1 = true;
    
      // Для прототипов изменения App1 не отражаются родительском App
      var App1 = new App();
      App1.prop1 = true;
    
    });
    $(function(){
    
      // Для первого случая есть изменения
      console.log(App.prop1); // true
    
      // Для второго случая создается новый потомок, который ничего не знает о других потомках
      var App1 = new App();
      console.log(App.prop1); // undefined
    
    });
    Ответ написан
    Комментировать
  • Для чего объявляют функции через константы?

    kurtov
    @kurtov
    Есть функции и есть переменные и это разные вещи. Вы можете присвоить функцию переменной (и даже более чем одной). Переменные объявленные через const вы не можете переприсвоить и не важно что вы хотите присвоить. Более того, функции тут не при чем. Ответ на ваш вопрос и вопрос "зачем использовать const?" одинаков.
    Более того, const это не константа, это всего лишь переменная которую нельзя переприсвоить. Да, такие примитивы как числа и строки будут работать как константы, потому что в js нет способа изменить значения примитивов без переприсвоения.
    const obj = {x: 5};
    obj.x = 6; // совсем не константа
    Ответ написан
    1 комментарий
  • Как с помощью $(this).find() задать для option внутри select, у которого value равняется переменной, включенный атрибут selected?

    kurtov
    @kurtov
    var $select = $('селектор нужных select');
    
    // Так можно установить значение для select, option автоматический выберется.
    $select.val(select1Val);
    Ответ написан
    Комментировать
  • Как правильно организовать сложную цепочку ajax-запросов?

    kurtov
    @kurtov
    this.start = function(){
        // останавливаем репликацию
        return this.stopAndClearExistsReplication()
            // удаляем локальную БД
            .always(function(){ return this.deleteLocalDB() })
            // создаём локальную БД
            .always(function(){ return this.createLocalDB() })
            // ставим БД на репликацию
            .done(function(){ return this.addReplicationDocument() })
            // ставим репликацию на отслеживание
            .done(function(){ return this.replicationMonitoring() });
    };

    По примеру похоже что вы в каждом предыдущем методе bind`ите правильный this так что можно вынести в функции выше.
    this.start = function(){
        // останавливаем репликацию
        return this.stopAndClearExistsReplication()
            // удаляем локальную БД
            .always(deleteLocalDB)
            // создаём локальную БД
            .always(createLocalDB)
            // ставим БД на репликацию
            .done(addReplicationDocument)
            // ставим репликацию на отслеживание
            .done();
    };
    
    function deleteLocalDB(){ return this.deleteLocalDB() }
    function createLocalDB(){ return this.createLocalDB() }
    function addReplicationDocument(){ return this.addReplicationDocument() }
    function replicationMonitoring(){ return this.replicationMonitoring() }


    Если доступны стрелочные функции и this один на все методы
    this.start = function(){
        // останавливаем репликацию
        return this.stopAndClearExistsReplication()
            // удаляем локальную БД
            .always(() => this.deleteLocalDB())
            // создаём локальную БД
            .always(() =>  this.createLocalDB())
            // ставим БД на репликацию
            .done(() => this.addReplicationDocument())
            // ставим репликацию на отслеживание
            .done(() =>  this.replicationMonitoring());
    };


    Если есть промисы и имена методов не требуют капитанских комментариев
    this.start = function(){
        return Promise.resolve()
            .then(() =>  this.stopAndClearExistsReplication())
            .always(() => this.deleteLocalDB())
            .always(() =>  this.createLocalDB())
            .done(() => this.addReplicationDocument())
            .done(() =>  this.replicationMonitoring());
    };
    Ответ написан
    4 комментария
  • Рекурсия в JavaScript с массивом, ломается?

    kurtov
    @kurtov
    Десять способов, 8 номер с рекурсией

    Вот еще модифицированный четвертый с использованием spread operator
    String.prototype.reverse = function() {
        return [...this].reverse().join('');
    };
    Ответ написан
    Комментировать
  • Почему jQuery.data() не обновляет значение атрибута?

    kurtov
    @kurtov
    Чтобы значение атрибута и значение jQuery совпадали их надо явно задать (модифицирована последняя строка).
    addBtn.click(function(e) {
        e.preventDefault();
        var lastId = $( ".employee:last .select" ).data('active');
        $( ".employee:first" ).clone().appendTo(".generate__section_employee");
        $( ".employee:last input" ).val('');
        $( ".employee:last .select" ).attr('data-active', lastId + 1).data('active', lastId + 1);
      });

    Это имеет смысл например, если в другом месте скрипта используется селектор $('[data-active=1') или же для душевного спокойствия.
    Ответ написан
    Комментировать