A collection of usefull tips in your evry day JS coding
Javascript ES6
2018
Fill an Array with random values (here 100 values between 0 and 1)
let values = Array(100).fill().map(Math.random);
Deep copy
let clone = Object.assign({}, source); // for an object
let clone = Object.assign([], source); // for an array
let clone = JSON.parse(JSON.stringify(Obj)); // for evrything
Shorthand for Console.log
var log = console.log; // then use log("chicken !");
2D Quasi-random number generator
static plastic(index){ const p1 = 0.7548776662466927; // inverse of plastic number const p2 = 0.5698402909980532; return {x:(p1 * index) % 1, y:(p2 * index) % 1}; }
1D Quasi-random number generator
static golden(index) { const p = 0.618033988749894848; // inverse of golden ratio return p * index % 1; }
shuffle an array
static shuffle(arr){ let i, p, tmp; for (i = arr.length - 1; i > 0; --i) { p = (Math.random() * (i + 1)) >> 0; if (p === i) { continue; } tmp = arr[i]; arr[i] = arr[p]; arr[p] = tmp; } }
Get random values in interval
static getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } static getRandomFloat(min, max) { return Math.random() * (max - min) + min; }
Clamping values
static clamp (value, min, max, loop = false) { if (loop === true) { if (value < min) { return max - ((min - value) % (max - min)); } if (value > max) { return min + ((value - max) % (max - min)); } } return Math.max(Math.min(value, max), min); };
static smoothstep(x, e0 = 0, e1 = 1) { x = Math.min(Math.max((x - e0) / (e1 - e0), 0.0), 1.0); return x * x * (3 - 2 * x); } static smoothstep2(x, e0 = 0, e1 = 1) { // Scale, bias and saturate x to 0..1 range x = Math.min(Math.max((x - e0) / (e1 - e0), 0.0), 1.0); // Evaluate polynomial return x * x * x * (x * (x * 6 - 15) + 10); }
Sleep
static sleep(timeMs) { return new Promise((resolve) => setTimeout(resolve, timeMs)); }
“Flash style” easing
object.x += (targetX – object.x) * easingFactor; object.y += (targetY – object.y) * easingFactor;
Constraint value
angle360 = ((angle % 360) + 360) % 360; angle180 = ((angle % 360) + 540) % 360 - 180;
Fast sign change
i = -i; i = ~i + 1; // faster i = (i ^ -1) + 1; // fastest
Fast modulo
If the divisor is a power of 2, the modulo operation can be done with : modulus = numerator & (divisor – 1);
mod = 131 % 4; mod = 131 & (4 - 1); // faster
Fast modulo lead to Fast parity test
isEven = (i % 2) == 0; isEven = (i & 1) == 0; // faster
Fast absolute value
absX = Math.abs(x); absX = x < 0 ? -x : x; // faster absX = (x ^ (x >> 31)) - (x >> 31); // fastest
Fast distance comparaison
Compare squared distance instead of real distance
Approximation of PI
22/7 355/113 103993/33102
Approximation of the golden number
987/610