Задать вопрос
  • Какой самый быстрый способ итерации массива в JS?

    @NonameMeTrue Автор вопроса
    Дмитрий, протестировал 2 случая с помощью benchmark.js, а именно итерацию 100к элементов:

    const array = new Array(100000).fill().map((_, i) => i);


    И реальную задачу с глубоким копированием объектов, где также используется пробег по аргументам с такой конструкцией:

    const deepCloneObject = function(mainObject, ...objects) {
        const result = isEmptyObject(mainObject) ? {} : deepCloneObject({}, mainObject);
        cycle {
            const thisObject = objects[i];
            if(!isObject(thisObject)) continue;
            mainFunctional(thisObject, result);
        }
        return result;
    }


    В 1 случае - победа была явно за for++, причём вне зависимости от кэширования и постфикса/префикса с результатом в 15,500 операций за секунду. for-- же имел отставание приблизительно в 5 тысяч ops/sec. Самые низкие же показатели были у while-- и у модифицированного ответа:

    const l = array.length - 1;
    for(let i = array.length; i--;) {
    const el = array[i];
    }


    ~ 7.5 тысяч, нежели:

    const l = array.length - 1;
    for(let i = array.length; i > 0;) {
    i--;
    const el = array[l - i];
    }


    ~ 10 тысяч ops/sec.

    Во 2-ом случае же снова победила такая конструкция:

    const l = array.length - 1;
    
    for(let i = array.length; i > 0;) {
    
    i--;
    const element = array[l - i];
    //...
    
    }


    Причём, здесь использовался постфикс i--, кэшированная длина, а также предварительный расчёт, дабы использовать указатели по нарастанию, а не убыванию.

    Результат - ~ 890к ops/sec, у остальных - ~ 800к.

    Если что, версия nodejs, на которой проводились тесты - 12.16.1.
  • Какой самый быстрый способ итерации массива в JS?

    @NonameMeTrue Автор вопроса
    И что, ваши тесты это подтвердили?


    Мои тесты показали абсолютно различные результаты с каждым запуском на ноде. Сперва они показывали превосходство i++ и ++i с/без кэшированием(я) при нескольких параллельно запущенных процессах. После их остановки и максимальном приоритете на задаче с итерацией массива, собственно, были даны более лояльные к i-- и --i результаты, причём именно к тем, в которых отсутствовало кэширование длины. Спустя ещё некоторое время - 10 раз подряд была выдана победа кэшированного i-- .

    Похоже на полную чушь. Какая разница языку отнимать единицу или складывать?


    Суть в том, чтобы изначально задать i, как длину массива, после чего проверять эту переменную статическим условием. В случае с инкрементом - условие всегда проверяется динамически.

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

    По поводу разницы в скорости - можно генерировать на сервере в зависимости от браузера клиента уже готовый собранный тем же вебпаком код, который будет оптимизирован под каждого так сказать.

    Но вообще, хотелось бы выиграть в производительности конкретно в nodejs, что аннулирует другие движки и нацеливается на контекст V8.
  • Какой самый быстрый способ итерации массива в JS?

    @NonameMeTrue Автор вопроса
    Alex, "Тестировал множество вариантов" - сразу же во втором предложении. Логично, что тесты уже проводились, но постоянно показывались различные результаты, о которых говорится дальше. Собственно, отсюда и вопрос - какой вариант самый "надёжно-быстро-стабильный"?
  • Как находить подгружаемые элементы через JQuery?

    @NonameMeTrue
    Ответ выше лучше использовать всего, если нужен полный доступ к новому элементу.

    Если же нужно наложить исключительно события, то можно просто использовать общий ивент для соответствующего класса:

    $(document).on('eventName', '.newPostElement', function() {
    	//Handler для всех элементов с классом newPostElement вне зависимости от того, когда был добавлен элемент с упомянутым классом.
    });
  • Как вывести определенный блок из файла при помощи ajax?

    @NonameMeTrue
    Лучше всего хранить описания блоков в переменных на любой из сторон, чтобы можно было легко обратиться к информации не добавляя дополнительных операций по парсингу.

    Для серверной(PHP) отдавать таким образом:

    if(!empty($_POST['getDesc'])) {
    	
    	//Хранение в виде: id(ключ) => информация
    	$descBlocks = [
    		'myid' => 'some',
    		'myid_f' => 'some_f'
    	];
    	
    	//Выдача информации на POST запрос и выход.
    	echo $descBlocks[$_POST['getDesc']] ? $descBlocks[$_POST['getDesc']] : '404';
    	exit();
    }


    Ajax(jQuery):

    $('.divs').click(function() {
    	var id = $(this).attr('id');
    	$.post('/content.php', {getDesc: id}, function(response) {
    		var finalBlock = '<div class="modal-wrap" id="'+id+'"><p>'+response+'</p></div>';
    		//Далее можем манипулировать информацией, к примеру: document.write(finalBlock);
    	});
    });


    Вариант с хранением на клиенте:

    var descBlocks = {
    	'myid': 'some',
    	'myid_f': 'some_f'
    };
    
    $('.divs').click(function() {
    	var id = $(this).attr('id');
    	var finalBlock = '<div class="modal-wrap" id="'+id+'"><p>'+descBlocks[id]+'</p></div>';
    });
  • Проверка - действительно ли клиент активировал почту по номеру телефона?

    @NonameMeTrue Автор вопроса
    Moskus, факт того, что это возможно сделать с помощью ноды на любом сайте - есть. Любая безопасность практически может быть обойдена(можно лишь сильно ограничить того, кто попробует её перейти), а значит, думаю вполне реально ответить на этот вопрос:
    И, на некоторых сервисах(к примеру, yandex'е) требуется ввести капчу, дабы отправить запрос на восстановление. Возможно ли обойти её другим запросом на репасс-ссылку или же перенаправлять картинку пользователю, считывать ответ и возвращать его?
  • Проверка - действительно ли клиент активировал почту по номеру телефона?

    @NonameMeTrue Автор вопроса
    Moskus, однако такая возможность есть. К примеру, для mail.ru подходит такой код:
    var request = require("request");
    request({
        uri: "https://e.mail.ru/api/v1/user/password/restore",
        headers: {
            host: "e.mail.ru"
        },
        form: {
            ajax_call: 1,
            "tab-time": Date.now(),
             email: "somemail@mail.ru",
             htmlencoded: false,
             api: 1,
             token: "",
             "x-email": "",
        },
        method: "POST",
        timeout: 10000,
        followRedirect: true,
        maxRedirects: 10
    }, function(error, response, body) {
        console.log(body.includes('"phones":["'));
    });
  • Проверка - действительно ли клиент активировал почту по номеру телефона?

    @NonameMeTrue Автор вопроса
    Moskus, значит, по Вашему это как должно работать?
  • Проверка - действительно ли клиент активировал почту по номеру телефона?

    @NonameMeTrue Автор вопроса
    Сергей delphinpro, просто делать первый этап восстановления, а именно - обычный ввод названия почты. После этого там обычно не отправляется уведомление, а показываются способы. И вот, если есть пункт "по номеру телефона", то логично, что почта привязана.
  • Проверка - действительно ли клиент активировал почту по номеру телефона?

    @NonameMeTrue Автор вопроса
    Сергей delphinpro, если такую проверку реализовать и не сообщать пользователю, то конечно же и такой реакции не будет, не так ли?