二:数据类型检测的方式有哪些?

62 阅读2分钟

(1)typeof
数组、对象、null 都会被判断为object,其他判断都正确。

console.log(typeof "hello"); // 输出 "string"        
console.log(typeof 123); // 输出 "number"       
console.log(typeof true); // 输出 "boolean"     
console.log(typeof {}); // 输出 "object"     
console.log(typeof []); // 输出 "object" (注意,对于数组,typeof也会返回"object")   

(2)instanceof instanceof可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。 instanceof只能正确判断引用数据类型,而不能判断基本数据类型。
instanceof运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性。

let car = new Vehicle();   
console.log(car instanceof Ve  hicle); // 输出 true

(3)constructor
constructor有两个作用,一是判断数据的类型,二是对象实例通过constructor对象访问它的构造函数。
需要注意,如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了
(4)Object.prototype.toString.call()

console.log(Object.prototype.toString.call("hello")); // 输出 "[object String]"
console.log(Object.prototype.toString.call(123)); // 输出 "[object Number]"   
console.log(Object.prototype.toString.call(true)); // 输出 "[object Boolean]"   
console.log(Object.prototype.toString.call({})); // 输出 "[object Object]"   
console.log(Object.prototype.toString.call([])); // 输出 "[object Array]"   
console.log(Object.prototype.toString.call(null)); // 输出 "[object Null]"  

Object.prototype.toString.call()使用Object对象的原型方法toString来判断数据类型,同样是检测对象obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call()的结果不一样,这是为什么?
这是因为toString是Object的原型方法,而Array、function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串),而不会区调用Object上原型toString()方法(返回对象的具体类型),所以采用obj.toiString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object原型上的toString方法。

image.png