为感激大家的反对,特发福利红包(支F宝口令红包),点击返回支付:Gitee
根本类型
String、Number、Boolean
援用类型
Null、Undefined、Object
typeof
最容易想到的是typeof,返回一个示意数据类型的字符串,返回后果包含: number boolean string object undefined function等,typeof能够对根本类型做出精确的判断,在对于援用类型的返回,基本上都是object。
// 根本类型var a = 1var b = "1"var c = falsevar d = undefinedconsole.log(typeof a) // numberconsole.log(typeof b) // stringconsole.log(typeof c) // booleanconsole.log(typeof d) // undefined// 检测办法var e = function(){}console.log(typeof e) // function// 检测null、数组、日期、正则、对象,后果全为object var f = []var g = nullvar h = new Date()var i = new RegExp()var j = {}console.log(typeof f) // objectconsole.log(typeof g) // objectconsole.log(typeof h) // objectconsole.log(typeof i) // objectconsole.log(typeof j) // object
instanceof
用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false; 注:instanceof检测的是原型
var arr = []console.log(arr instanceof Array) // trueconsole.log(arr instanceof Object) // true
用instanceof检测数组是不是对象,返回的true,why?instanceof的机制是,只有以后类呈现在实例的原型对象上,后果都是true,因为arr.__proto__为Array.prototype,而后Array.prototype.__proto__为Object.prototype,也就是arr.__proto__.__proto__为Object.prototype,所以后果为true。也就是说,咱们能够更改原型链的指向,导致检测数据类型不精确。
- 注:无奈检测根本数据类型
var a = 1var b = "1"var c = falseconsole.log(a instanceof Number) // falseconsole.log(b instanceof String) // falseconsole.log(c instanceof Boolean) // false
constructor
能够检测全副类型(undefined和null除外)
- 相比于instanceof的长处,能够检测根本数据类型
var a = 1var b = "1"var c = falseconsole.log(a.constructor === Number) // trueconsole.log(b.constructor === String) // trueconsole.log(c.constructor === Boolean) // true
- 且不会顺着原型链找
var arr = []console.log(arr.constructor === Array) // trueconsole.log(arr.constructor === Object) // false
- 毛病是能够随便更改constructor
var arr = []Array.prototype.constructor = "q"console.log(arr.constructor === Array) // false
Object.prototype.toString.call
最规范的检测数据类型办法,toString是Object原型对象上的一个办法,并不是转为字符串,该办法默认返回其调用者的具体类型,更严格的讲,是toString运行时this指向的对象类型,返回的类型格局为[object,x],x是具体的数据类型,其中包含:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,… 基本上所有对象的类型都能够通过这个办法获取
var a = 1var b = "1"var c = falsevar d = undefinedvar e = function(){}var f = []var g = nullvar h = new Date()var i = new RegExp()var j = {}console.log(Object.prototype.toString.call(a)) // [object Number]console.log(Object.prototype.toString.call(b)) // [object String]console.log(Object.prototype.toString.call(c)) // [object Boolean]console.log(Object.prototype.toString.call(d)) // [object Undefined]console.log(Object.prototype.toString.call(e)) // [object Function]console.log(Object.prototype.toString.call(f)) // [object Array]console.log(Object.prototype.toString.call(g)) // [object Null]console.log(Object.prototype.toString.call(h)) // [object Date]console.log(Object.prototype.toString.call(i)) // [object RegExp]console.log(Object.prototype.toString.call(j)) // [object Object]
- IE6下,undefined和null均为Object