JavaScriptの魔法
[下書き] 命令型 vs 再帰型 vs 関数型
命令型 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];}Promise: 最高だ!
// Bluebird Promiseとその使用例var 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); // コンテンツ(最初の引数)を受け取る関数- ネイティブのES6 Promiseは素晴らしいが、私は堅牢な Bluebird Promise Library を好む。
- ライブラリかどうかに関わらず、モダンブラウザは長年Promiseをサポートしてきた。
- Promiseはクレイジーなパターンなしで利用できる。暗黙的な
deferredの方が望ましい。 - $qはただただひどい。bluebirdを使えばいい。上記参照。
- 言及しておく価値あり: Bluebirdのベンチマークはベストケースのテストなので、複雑なファンシーなPromiseチェーンを行う場合は注意すること
Java vs JavaScript
レート制限 / デバウンス / スロットリング
- JavaScriptでは、David Walshがデバウンスを実装したのは20行未満だった!
- Javaでは、JDebounceというライブラリがあり、はるかに複雑で、約500行以上ある。
- _ 両者を比較すると: _
- JavaScriptは高速で、第一級関数を使用して見事なシンプルさを実現している。
- 対照的にJavaは、多くの可動部分を持ち、注釈を使用してコンパイル時に動作を適用し、そして楽しみのために大量のXMLがある!