typeof base type expr value --------------------------------------------------------------------------object⭐️ Null Null nullnull--------------------------------------------------------------------------undefined Undefined Undefined undefinedundefined--------------------------------------------------------------------------number Number Number 3737number Number Number 3.14
// ⭐️ type name
// - require:
// • baseTypeName()
// • isClass()
function typeName(value) {
if (isClass(value)) return "class"; // class
return baseTypeName(value); // other cases
}
📁 module (copy and paste this file to use it)
// ⭐ base type name
function baseTypeName(value) {
// --------------
// ↓ ↱ -1 (index of last character)
// 0123456789012
// ╭──╮
// "[object XXXX]" ╭───╮
// ^^^^ <---- slice(8, -1)
return Object.prototype.toString.call(value).slice(8, -1);
}
/**
* ⭐️ content of function's definition
*
* @throws {TypeError} will throw a TypeError if value is not a function
* @return {string}
*/
function functionDefinition(value) {
// ---------------------------------------------------------------------
// ⭐️ will throw a TypeError if value is not a function:
// ⛔ TypeError:
// Function.prototype.toString requires that 'this' be a Function
// ---------------------------------------------------------------------
return Function.prototype.toString.call(value);
}
// ⭐️ check if value is a function
// - require: baseTypeName()
function isFunction(value) {
return baseTypeName(value) === "Function";
}
// ⭐️ check if value is a "class"
// - require:
// • isFunction()
// • functionDefinition()
function isClass(value) {
return (
// `value` is a function
isFunction(value) &&
// `value` is a "class" definition
functionDefinition(value).startsWith("class")
);
}
// ⭐️ type name
// - require:
// • baseTypeName()
// • isClass()
function typeName(value) {
if (isClass(value)) return "class"; // class
return baseTypeName(value); // other cases
}
// node exports
module.exports = {
baseTypeName,
isFunction,
functionDefinition,
isClass,
typeName,
}