原文: https://mp.weixin.qq.com/s/s6IbrijsSpdLsPFouGnMnQ
基本类型
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
公众号回复 3 可获取面试资料,包含前后端及简历模板
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。