docs: function isEqual(a, b)
  {
  	// objects are directly equal
  	if(a === b){
  		return true;
  	}
  	// recurse for each pair of array items
  	else if( Array.isArray(a) && Array.isArray(b) && a.length === b.length ){
  		return a.every( function (v,i) { return isEqual(a[i], b[i]); } );
  	}
  	// recurse for every key/val pair in objects
  	else if( a instanceof Object && b instanceof Object
  		&& isEqual(Object.keys(a).sort(), Object.keys(b).sort()) )
  	{
  		for(var k in a){
  			if( !isEqual(a[k], b[k]) )
  				{ return false; }
  		}
  		return true;
  	}
  	else {
  		return false;
  	}
  }