In JavaScript everything is an object, even functions and numbers, and all objects even functions are first class citizens (which allow functional programming).
So this mean that you can call methods over numbers, and you can add new methods using Number.prototype
. Here is example of range functions similar to that from Python, but bit different. (Python one return number from n to m – or from 0 to n – but this one return n numbers (n is this) starting from number passed as argument)
Number.prototype.range = function(n, result) { result = result || []; n = typeof n === 'undefined' ? 0 : n; if (this <= 0) { return result.reverse(); } else { return this.range.call(this-1, n, result.concat([this-1+n])); } };
And you can call this function/method using:
10..range(1);
It will return array [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
.
Note that there are two dots, it’s because when you use one it’s interpret as float number and thorw exception "SyntaxError: Unexpected token ILLEGAL"
because it wait for a digit as next character. The other options is to use parenthesis like (10).range(1);
Using this you can write factorial using
10..range(1).reduce(function(a, b) { return a*b; });
reduce function was added to Array.prototype in ECMAScript 5, You can check what browsers support them in this page.
You can wrap that code with a function and you can add it as Number prototype
Number.prototype.factorial = function() { return this.range(1).reduce(function(a, b) { return a*b; }); };
You can call it as:
10..factorial();
Here is example of times function (similar to that from Ruby)
Number.prototype.times = function(fn, self) { return this.range().forEach(fn, self); };
You can use this function using:
10..times(function(i) { console.log(i); });