为感激大家的反对,特发福利红包(支F宝口令红包),点击返回支付:Gitee
根本类型
String、Number、Boolean
援用类型
Null、Undefined、Object
typeof
最容易想到的是typeof,返回一个示意数据类型的字符串,返回后果包含: number boolean string object undefined function等,typeof能够对根本类型做出精确的判断,在对于援用类型的返回,基本上都是object。
// 根本类型
var a = 1
var b = "1"
var c = false
var d = undefined
console.log(typeof a) // number
console.log(typeof b) // string
console.log(typeof c) // boolean
console.log(typeof d) // undefined
// 检测办法
var e = function(){}
console.log(typeof e) // function
// 检测null、数组、日期、正则、对象,后果全为object
var f = []
var g = null
var h = new Date()
var i = new RegExp()
var j = {}
console.log(typeof f) // object
console.log(typeof g) // object
console.log(typeof h) // object
console.log(typeof i) // object
console.log(typeof j) // object
instanceof
用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false; 注:instanceof检测的是原型
var arr = []
console.log(arr instanceof Array) // true
console.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 = 1
var b = "1"
var c = false
console.log(a instanceof Number) // false
console.log(b instanceof String) // false
console.log(c instanceof Boolean) // false
constructor
能够检测全副类型(undefined和null除外)
- 相比于instanceof的长处,能够检测根本数据类型
var a = 1
var b = "1"
var c = false
console.log(a.constructor === Number) // true
console.log(b.constructor === String) // true
console.log(c.constructor === Boolean) // true
- 且不会顺着原型链找
var arr = []
console.log(arr.constructor === Array) // true
console.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 = 1
var b = "1"
var c = false
var d = undefined
var e = function(){}
var f = []
var g = null
var 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
发表回复