JS数据类型判断

183 阅读2分钟

typeof

typeof运算符把类型信息当做字符串返回

  • 对于原始值类型(除了null)都可以正确判断
  • 对于对象(除了函数)都显示为object

原始值类型:number string boolean symbol(es6) bigint(es6) undefined null

引用类型:对象(Object)、数组(Array)、函数(Function)

//值类型判断
typeof 123 //number

typeof 'str' //string

typeof true //boolean

typeof undefined //undefined

typeof null //object

//引用类型判断
typeof function fn() { } //function

typeof { name: "age" } //object

**注意:**虽然typeof null的结果是object,但是null并不是对象,这是JS一个存在历史悠久的bug,在JS最初版本使用的是32位系统,为了考虑性能等原因,JS使用低位存储变量信息,000开头表示object,而null表示为全零,所以null被错误的判定为object。

instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链

  • 通过原型链进行判断,只要在其原型链上,就会返回true
[] instanceof Array // true
{} instanceof Object // true
123 instanceof Array //false
  • 可以通过Symbol.hasInstance重定义instanceof的行为,所以instanceof的结果并不一定准确。
class String{
  static [Symbol.hasInstance](str){
      return typeof str ==='string'
  }
}
console.log('sss' instanceof String) //true

Objct.prototype.toString.call()

Object.prototype.toString方法返回对象的类型字符串。

在介绍Object.prototype.toString.call()方法之前我们先看看toString()方法和Object.prototype.toString.call()方法对比

Object.toString()和Object.prototype.toString()的区别

let obj = {}

Object.toString(obj) //function Object() { [native code] }

//通过call指定obj为Object.prototype对象中的toString方法的上下文
Object.prototype.toString.call(obj)  //[object Object]
  • Object.toString()是Object构造函数上的方法,返回的是对应的函数
  • Object.prototype.toString()是Object原型对象上的方法,返回的是代表该对象的字符串

不懂原型的可以看这篇文章github.com/mqyqingfeng…

为什么Array,String,Number等等不能直接调用toString?

因为在Array,String,Number等都重写了toString,直接调用的话就是调用自身的原型对象上的toString()方法了。

//toString()返回对应数值的字符串表达
var age = 15;
age.toString();//'15'

//toString()返回布尔值的字符串表达
var bool = false;
bool.toString() //'false'

Object.prototype.toString()是Object原型对象上的方法,返回的是代表该对象的字符串,因此可以用来判断一个值的类型。

Object.prototype.toString()判断数据类型

//判断基本类型
console.log(Object.prototype.toString.call(2))         // "[object Number]"
console.log(Object.prototype.toString.call(''))        // "[object String]"
console.log(Object.prototype.toString.call(true))      // "[object Boolean]"
console.log(Object.prototype.toString.call(undefined)) // "[object Undefined]"
console.log(Object.prototype.toString.call(null))      // "[object Null]"
//判断引用类型
console.log(Object.prototype.toString.call(Math))      // "[object Math]"
console.log(Object.prototype.toString.call({}))        // "[object Object]"
console.log(Object.prototype.toString.call([]))        // "[object Array]"

通用的类型判断

function type (o){
  var s = Object.prototype.toString.call(o);
  
  //match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。返回存放匹配结果的数组
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};

type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"

参考文章:

浅析 Object.prototype.toString()

判断数据类型的方案

如果有问题,评论区多多指教哦