There are a few techniques for this, but here's what I always fall back. Writing this down for posterity.
function isArray(sut) {
return Object.prototype.toString.call(sut) === '[object Array]';
}
function isObject(sut) {
return Object.prototype.toString.call(sut) === '[object Object]';
}
function isFunction(sut) {
return Object.prototype.toString.call(sut) === '[object Function]';
}
function isDate(sut) {
return Object.prototype.toString.call(sut) === '[object Date]';
}
function isBoolean(sut) {
return Object.prototype.toString.call(sut) === '[object Boolean]';
}
function isNumber(sut) {
return Object.prototype.toString.call(sut) === '[object Number]';
}
function isString(sut) {
return Object.prototype.toString.call(sut) === '[object String]';
}
function isRegex(sut) {
return Object.prototype.toString.call(sut) === '[object Regex]';
}
function isNull(sut) {
return Object.prototype.toString.call(sut) === '[object Null]';
}
function isUndefined(sut) {
return Object.prototype.toString.call(sut) === '[object Undefined]';
}
These functions use object's version of toString.