typeof 类型判断
typeof 判断只能 JavaScript 中的根本类型和 Object 援用类型, 对于各种 Object 只是粗略的判断为 Object 类型, 并不会判断出对象的具体类型。所以 typeof 能判断的类型有 Number, String, Boolean, Symbol, undefined,BigInt,Object.
注:typefo null 的后果为 Object 类型的, 但实际上 null 并不是 Object 类型, 它所以 Null 类型, 能的到这样的后果是因为 JavaSscript typeof 行为上的谬误所导致的。
// 1. typeof
let symbol = Symbol()
typeof 23 // number
typeof "Jason" // string
typeof true // boolean
typeof undefined // undefined
typeof symbol // symbol
typeof 9007199254740991n // bigint
// 不判断对象的具体类型
typeof {} // object
typeof [] // object
typeof new Error() // object
typeof null // object
typeof function(){} // function
注: function 函数隶属于 Object 类型的 然而 typeof function 时返回的是 function 而并不是 Object, 这是因为 typefo 对于 function 函数辨别看待, 理论不并不存在 function 类型, 这是 JavaSscript 晚期的谬误, 但对编程十分便当。
instanceof 类型判断
instanceof 判断对象的具体类型, instanceof 是通过指标对象中原型链的 prototype 与指定类型的 prototype 进行类型查看, 只有原型链中存在指定类型的原型 prototype 就返回 true 反之 false, instanceof 没有 typeof 那么局限, 它能够对 Object 的各类对象进行具体的查看判断。
new Date() instanceof Date // true
new String() instanceof String // true
new Number() instanceof Number // true
new Error() instanceof Error // true
function(){} instanceof Function // true
new Map() instanceof Map // true
new Set() instanceof Set // true
new RegExp('ab+c', 'i') instanceof RegExps // true
....
注:null 没有原型, 所以不可用此办法进行判断
Object.prototype.toString() 类型判断
各种类型或对象调用 Object.prototype.toString() 办法时将返回 [object 类型] 的字符串, 能够用来判断各种数据类型。只是返回的的字符串可能在理论的编程利用中有点不好操作, 所以须要一函数来对判断后返回的后果进行解决。
let res= {}
"Null Undefined String Number Boolean Function Date RegExp Error Array Object Math JSON Class".split(" ").map(item =>{res["[object"+ item + "]"] = item.toLowerCase();})
function type(obj){return typeof obj === "object" || typeof obj === "function" ? res[Object.prototype.toString.call(obj)] || "object" : typeof obj;
}
// 测试
let date = new Date();
function f(){}
type(date); // date
type(f); // function
type([]) // array