JavaScript Магия
Императивный против Рекурсивного против Функционального
Императивный vs. Рекурсивный vs. Функциональный
[ В процессе разработки ]
// Императивный: Самый быстрый ( + очень простой, без новых указателей или лишних выделений памяти ):function fib(n) { var a = 1, b = 1, c = 0; for (var i = 1; i < n - 1; ++i) { c = a + b; a = b; b = c; } return b;}
// Рекурсивный: (Только FIREFOX или BABELJS) Определение функции ES6 с// параметрами по умолчанию для установки начальных (внутренних/рекурсивных) значенийfunction fib(n, current = 0, a = 1, b = 1, c = 0) { current++; c = a + b; a = b; b = c; return current >= n ? b : fib(n, current, a, b, c);}
// Пример из учебника с плохим управлением области видимости и множеством изменяемых внешних значенийfunction fib(n) { if (!arr) { var arr = [1, 1]; n = n - 2; } // Плохо if (n === -1) { return [arr[0]]; } if (n === 0) { return arr; } var proc = function() { --n; arr.push(arr[arr.length - 1] + arr[arr.length - 2]); return n === 0 ? arr : proc(); // Плохо: внутренняя рекурсивная функция не нужна, подсказка: используются переменные из области видимости родительской функции }; var ans = proc(); return ans[ans.length - 1];}Промисы: Отлично!
// Пример использования промисов Bluebirdvar Promise = require("bluebird"), fs = Promise.promisifyAll(require("fs")), less = Promise.promisifyAll(require("less"));
function writeFileData(data) { return fs.writeFileAsync("/tmp/output.css", data);}// Bluebird делает это, возможно, слишком простым и лаконичным:fs.readFileAsync("./style.less") // Вызов промисифицированной функции readFile() .then(less.renderAsync) // Передача в less.render .then(writeFileData); // Функция для получения содержимого css (первый параметр)- Хотя встроенные ES6 Promises хороши, я предпочитаю надежную библиотеку Bluebird Promise.
- Библиотека или нет, современные браузеры поддерживают Promises уже много лет.
- Промисы можно использовать без сложных паттернов - неявные
deferredпредпочтительны. - $q просто ужасен - используйте bluebird, см. выше.
- Стоит упомянуть: тесты Bluebird являются оптимистичными, обратите внимание при использовании сложных цепочек промисов
Java vs JavaScript
Ограничение скорости / Дебаунсинг / Троттлинг
- В JavaScript Дэвид Уоллс реализовал debounce менее чем за 20 строк!
- В Java, JDebounce, библиотека, которая намного сложнее, около 500+ строк.
- _ Сравнивая два: _
- JavaScript быстр и использует first-class функции для достижения выдающейся простоты.
- В то время как Java имеет гораздо больше движущихся частей, аннотации используются для применения поведения на этапе компиляции, и есть тонна XML, просто для развлечения!