fuckNaN(), seriously
I generally like dynamic languages and in generally don't run into much trouble with them. Having that said, I hate the way undefined and NaN work in Javascript.
This turns a simple typo into a NaN apocalypse. After half of your numbers have turned into NaNs it's hard to find out where they came from.
var o = {y: 0}, #NaN 1/o; #NaN var x = 1/o.x; #NaN var y = x*10;
Setting up traps
So how do you catch stray NaNs? You set up traps. Because it can become very tedious and error prone to have asserts everywhere I wrote a little helper, fuckNaN().
function fuckNaN(obj, name){ var key = '__' + name; obj.__defineGetter__(name, function(){ return this[key]; }); obj.__defineSetter__(name, function(v) { // you can also check for isFinite() in here if you'd like to if(typeof v !== 'number' || isNaN(v)){ throw new TypeError(name + ' isNaN'); } this[key] = v; }); } // Examples var o = {x: 0}; fuckNaN(o, 'x'); // throws TypeError: x isNaN o.x = 1/undefined; // Also works with prototypes function O(){ this.x = 0; } fuckNaN(O.prototype, 'x'); var o = new O(); // throws TypeError: x isNaN o.x = 1/undefined;
Place some of those traps during debug mode in critical locations like your Vector and Matrix classes and they will bring doom and destruction to those NaNs..
Note: This doesn't work in IE<=8 and you shouldn't use it in production. Use it as a tool during development to make your code fail early.