typeof
typeof操作符返回一个字符串,表示操作值的类型 利用typeof操作符的语法是 typeof target
console.log(typeof 123) //number
console.log(typeof '123') //string
console.log(typeof undefined) //undefined
console.log(typeof function() {}) //function
console.log(typeof []) //object
console.log(typeof {}) //object
console.log(typeof null) //object
console.log(typeof /\d/g) //object
console.log(typeof new Date()) //object
console.log(typeof new Error()) //object
typeof可以返回除null以外的所有基本数据类型已经function null和其他引用类型返回的都是object
instanceof
instanceof运算符用来检测构造函数的prototype属性是否在实例化对象的原型链上 instanceof运算符的语法是 target instanceof constructor
console.log(123 instanceof Number) //false
console.log('123' instanceof String) //false
console.log(true instanceof Boolean) //false
console.log(Symbol(123) instanceof Symbol) //false
console.log([] instanceof Array) //true
console.log({} instanceof Object) //true
console.log(function(){} instanceof Function) //true
console.log(undefined instanceof undefined) // TypeError: Right-hand side of 'instanceof' is not an object
console.log(null instanceof null) // TypeError: Right-hand side of 'instanceof' is not an object
console.log(new Date() instanceof Date) //true
console.log(/\d/g instanceof RegExp) //true
console.log(new Error() instanceof Error) //true
用于判断操作值是否是指定构造函数的实例。
缺点:
- 不能判断基本数据类型,因为基本数据类型并不是构造函数的实例,没有原型链.
- 因为原型链的终点 Object.prototype=>null,所以所有引用类型的原型链上都有存在Object.prototype,所以所有引用类型的 instanceof Object 都会返回true.
- 原型链可以被修改,所以结果值不一定准确.
constructor
利用constructor判断数据类型的语法是target.constructor===constructor
// Number
console.log((123).constructor)
// String
console.log('123'.constructor)
// Boolean
console.log(true.constructor)
// Symbol
console.log(Symbol(123).constructor)
// Array
console.log([].constructor)
// Object
console.log({}.constructor)
// Function
console.log(function(){}.constructor)
// TypeError: Cannot read properties of undefined (reading 'constructor')
console.log(undefined.constructor)
// TypeError: Cannot read properties of null (reading 'constructor')
console.log(null.constructor)
// Date
console.log(new Date().constructor)
// RegExp
console.log(/\d/g.constructor)
// Error
console.log(new Error().constructor)
用于判断操作值是否是指定构造函数的实例,可以判断null和undefined除外的所有数据类型,之所以null和undefined不可以,是因为他们作为JavaScript运行环境创建时就存在的基本数据类型,不存在constructor属性.
基本数据类型为什么会有constructor属性呢?是因为基本数据类型获取constructor属性的时候JavaScript自动将基本数据类型的值转为包装对象实例,并在使用后立即销毁实例。
缺点:constructor属性可以被修改,所以结果值不一定准确.
Object.prototype.toString
利用Object.prototype.toString判断数据类型的语法是Object.prototype.toString.call(target)
console.log(Object.prototype.toString.call(123))
// '[object String]'
console.log(Object.prototype.toString.call('123'))
// '[object Boolean]'
console.log(Object.prototype.toString.call(true))
// '[object Symbol]'
console.log(Object.prototype.toString.call(Symbol(123)))
// '[object Array]'
console.log(Object.prototype.toString.call([]))
// '[object Object]'
console.log(Object.prototype.toString.call({}))
// '[object Function]'
console.log(Object.prototype.toString.call(function(){}))
// '[object Undefined]'
console.log(Object.prototype.toString.call(undefined))
// '[object Null]'
console.log(Object.prototype.toString.call(null))
// '[object Date]'
console.log(Object.prototype.toString.call(new Date()))
// '[object RegExp]'
console.log(Object.prototype.toString.call(/\d/g))
// '[object Error]'
console.log(Object.prototype.toString.call(new Error()))
可以准确判断所有数据类型
| 标题 | typeof | instanceof | constructor | Object.prototype.toString |
|---|---|---|---|---|
| number | true | false | true | true |
| string | true | false | true | true |
| boolean | true | false | true | true |
| symbol | true | false | true | true |
| [] | false | true | true | true |
| {} | false | true | true | true |
| function | true | true | false | true |
| undefined | true | true | false | true |
| null | false | true | true | true |
| new Date() | false | true | true | true |
| /\d/g | false | true | true | true |
| new Error() | false | true | true | true |