JavaScript Mágico
[borrador] Imperativo vs. Recursivo vs. Funcional
Imperativo vs. Recursivo vs. Funcional
[ En progreso ]
// Imperativo: El más rápido ( + muy simple, sin nuevos punteros ni asignaciones excesivas ):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;}
// Recursivo: (SÓLO FIREFOX O BABELJS) Definición de función ES6 con// valores predeterminados usados para establecer valores iniciales (internos/recursivos)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);}
// Ejemplo de libro de texto malo - mala gestión del alcance de la función con múltiples valores mutables externosfunction fib(n) { if (!arr) { var arr = [1, 1]; n = n - 2; } // Mal 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(); // Mal: no se necesita función recursiva interna, pista: las variables usadas provienen del alcance de la función padre }; var ans = proc(); return ans[ans.length - 1];}Promesas: ¡Genial!
// Ejemplo usando promesas Bluebird yvar Promise = require("bluebird"), fs = Promise.promisifyAll(require("fs")), less = Promise.promisifyAll(require("less"));
function writeFileData(data) { return fs.writeFileAsync("/tmp/output.css", data);}// Bluebird hace que algo como esto sea perhaps incómodamente simple y conciso:fs.readFileAsync("./style.less") // Llama a readFile() promisificado .then(less.renderAsync) // Pasa a less.render .then(writeFileData); // Función que recibe los contenidos css (primer parámetro)- Mientras las promesas nativas de ES6 son buenas, prefiero la robusta Biblioteca de Promesas Bluebird.
- Con o sin biblioteca, los navegadores modernos han soportado Promesas durante años.
- Las promesas pueden usarse sin patrones complicados - la
deferredimplícita es preferible. - $q es horrible usa bluebird, véase arriba.
- Vale la pena mencionar: los benchmarks de Bluebird son pruebas en condiciones ideales, así que tenlo en cuenta si haces cadenas de promesas complejas
Java vs JavaScript
Limitación de Velocidad / Debounce / Throttle
- En JavaScript David Walsh implementó debounce en menos de 20 líneas!
- En Java, JDebounce, una librería mucho más compleja, tiene ~500+ líneas.
- _ Comparando las dos: _
- El JavaScript es rápido y usa funciones de primera clase para lograr una simplicidad brillante.
- Mientras que el Java tiene muchas más partes móviles, se usan anotaciones para aplicar comportamiento en tiempo de compilación, y hay un montón de XML, solo por diversión!