JS判断数据类型的方式有哪些

153 阅读2分钟

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

用于判断操作值是否是指定构造函数的实例。

缺点:

  1. 不能判断基本数据类型,因为基本数据类型并不是构造函数的实例,没有原型链.
  2. 因为原型链的终点 Object.prototype=>null,所以所有引用类型的原型链上都有存在Object.prototype,所以所有引用类型的 instanceof Object 都会返回true.
  3. 原型链可以被修改,所以结果值不一定准确.

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()))

可以准确判断所有数据类型

标题typeofinstanceofconstructorObject.prototype.toString
numbertruefalsetruetrue
stringtruefalsetruetrue
booleantruefalsetruetrue
symboltruefalsetruetrue
[]falsetruetruetrue
{}falsetruetruetrue
functiontruetruefalsetrue
undefinedtruetruefalsetrue
nullfalsetruetruetrue
new Date()falsetruetruetrue
/\d/gfalsetruetruetrue
new Error()falsetruetruetrue