检测数据类型的方式
typeof
返回结果是一个字符串,typeof不能检测null,和数组,都是返回的object
typeof可以检测基本数据类型和引用数据类型缺点: 不能检测null 和 Array,返回的都是Object
typeof 1
"number"
typeof "1"
"string"
typeof false
"boolean"
typeof null
"object"
typeof undefined
"undefined"
typeof {}
"object"
typeof []
"object"
typeof /\d/
"object"
typeof Symbol(1)
"symbol"
typeof 2n
"bigint"
typeof function(){}
"function"
instanceof
instanceof
不能用于判断基本数据类型,只能用于判断引用数据类型,判断其是否属于某个类的实例对象 instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car(‘Honda‘, ‘Accord‘, 1998);
console.log(typeof Car);//typeof可以检测function类型,但是不能检测Array和null
console.log(auto instanceof Car);//true
console.log(auto instanceof Object);//true
console.log([1,2] instanceof Array);//true
console.log([] instanceof Array);//true
console.log([] instanceof Object);//true
console.log({} instanceof Object);//true
console.log({name:‘123‘} instanceof Object);//true
console.log(Function instanceof Object);//true
console.log(function(){} instanceof Object);//true
/* *************************** */
/* 特殊的情况 */
console.log("1" instanceof String); //false?
console.log(1 instanceof Number); //false? ??注意: instanceof 不能用于判断基本数据类型,只能用于判断引用数据类型,判断其是否属于某个类的实例对象
console.log(true instanceof Boolean); //false?
//
console.log(new String("1") instanceof String);//true
console.log(new Number(1) instanceof Number);//true
console.log(new Boolean(true) instanceof Boolean);//true
constructor
注意: constructor不能用于undefined和null的检测,因为他们没有构造函数
console.log("".constructor===String);//true
console.log("1".constructor===String);//true
console.log([].constructor===Array);//true
console.log([].constructor===Object);//false? ??这就是constructor的缺陷,检测不一定准确
console.log({}.constructor===Object);//true
console.log(/\d/.constructor===RegExp);//true
console.log(/\d/.constructor===Object);//false? ?? 这就是constructor的缺陷,检测不一定准确
//注意: constructor不能用于undefined和null的检测,因为他们没有构造函数
console.log("".constructor===String);//true
console.log("1".constructor===String);//true
console.log([].constructor===Array);//true
console.log([].constructor===Object);//false? ??这就是constructor的缺陷,检测不一定准确
console.log({}.constructor===Object);//true
console.log(/\d/.constructor===RegExp);//true
console.log(/\d/.constructor===Object);//false? ?? 这就是constructor的缺陷,检测不一定准确
Object.prototype.toString.call()
每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object type],其中 type 为对象的类型。但当除了 Object 类型的对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,所以我们需要使用call或者apply方法来改变toString方法的执行上下文
优点:这种方法对于所有基本的数据类型都能进行判断
,即使是 null和defined也能进行检测.
Object.prototype.toString.call(‘An’) // “[object String]”
Object.prototype.toString.call(1) // “[object Number]”
Object.prototype.toString.call(Symbol(1)) // “[object Symbol]”
Object.prototype.toString.call(null) // “[object Null]”
Object.prototype.toString.call(undefined) // “[object Undefined]”
Object.prototype.toString.call(function(){}) // “[object Function]”
Object.prototype.toString.call({name: ‘An’}) // “[object Object]”