1、typeof
检测方法:
1、console.log(typeof 1) // number 2、console.log(typeof 'str') // string 3、console.log(typeof true) // boolean 4、console.log(typeof undefined) // undefined 5、console.log(typeof {}) // object 6、console.log(typeof []) // object 7、console.log(typeof null) // object 8、console.log(typeof function() {}) // object 9、console.log(type typeof new RegExp()) // object
结论:
- 1、typeof 只能准确的检测数一些基本类型
- 2、正则、null、对象、数组检测出来的都是是对象,并不是十分准确
2、instanceof
instanceof
方法用来检测 某函数/某类
是否为某实例对象
的构造器
检测方法:
console.log({} instanceof Object) // true console.log([] instanceof Array) // true console.log(new Date() instanceof Date) // true console.log(1 instanceof Number) // false console.log('str' instanceof String) // false console.log(null instanceof Object) // false
结论:
- 1、
instanceof
可以判断这个变量是否为某个函数的实例,而typeof
不能 - 2、
instanceof
只能通过true
或者false
来判断,不能直接看出来是什么类型 - 3、
基本类型
的判断是错误的
3、constructor构造函数
检测方法:
function Father(){} function Sun(){} Sun.prototype = new Father(); Sun.prototype.constructor = Sun; let sun = new Sun(); sun.constructor === Sun // true sun.constructor === Sun // false sun.constructor === Object
结论:1、constructor容易被修改
4、终极大法 Object.portotype.toString.call()
获取Object.portotype上的toString
方法,让方法的this
变为需要检测的数据类型值
检测方法:
Object.prototype.toString.call(true) //[object Boolean] Object.prototype.toString.call(1) //"[object Number]" Object.prototype.toString.call('str') //"[object String]" Object.prototype.toString.call({}) //"[object Object]" Object.prototype.toString.call(function () {}) //"[object Function]" Object.prototype.toString.call(Undefined) //"[object Undefined]" Object.prototype.toString.call(Null) //"[object Null]" Object.prototype.toString.call(new RegExp()) //"[object RegExp]" 等等
总结:
- 1、基本上所有类型都可以判断
- 2、
Object.prototype.toString
执行的时候返回当前方法中的this的所属类信息 - 3、不能精准判断
自定义对象
,对于自定义对象只会返回[object Object]
,但是instanceof
可以弥补这个缺点
总结不到位的,希望各位大大多多交流指正~~