sjl.js
function classOf (value) {
        var retVal,
            valueType,
            toString;
        if (typeof value === _undefined) {
            retVal = _Undefined;
        }
        else if (value === null) {
            retVal = _Null;
        }
        else {
            toString = value.toString.name === 'toString' ? Object.prototype.toString : value.toString;
            valueType = toString.call(value);
            retVal = valueType.substring(8, valueType.length - 1);
            if (retVal === _Number && isNaN(value)) {
                retVal = 'NaN';
            }
        }
        return retVal;
    }
function classOf (value) {
        var retVal,
            valueType,
            toString;
        if (typeof value === _undefined) {
            retVal = _Undefined;
        }
        else if (value === null) {
            retVal = _Null;
        }
        else {
            toString = value.toString.name === 'toString' ? Object.prototype.toString : value.toString;
            valueType = toString.call(value);
            retVal = valueType.substring(8, valueType.length - 1);
            if (retVal === _Number && isNaN(value)) {
                retVal = 'NaN';
            }
        }
        return retVal;
    }
Returns the class name of an object from it's class string.
@note Returns 'NaN' if value type is 'Number' and value isNaN evaluates to true as of version 0.4.85.
@note If your type (constructor/class) overrides it's `toString` method use a named `toString` method to get the accurate constructor name out of `classOf`;  E.g., If you do override `toString` on your class(es) and don't set them to named functions then `sjl.classOf*` will use Object.prototype.toString to pull your classes type out.
@function module:sjl.classOf
@param value {*}
@returns {string} - A string representation of the type of the value; E.g., 'Number' for `0`