JavaScript数据类型检测总结

在js中,有四种用于检测数据类型的方式,分别是:前端

  • typeof  用来检测数据类型的运算符
  • instanceof    检测一个实例是否属于某个类
  • constructor   构造函数
  • Object.prototype.toString.call()  原型链上的Object对象的toString方法

下面咱们就来分别介绍一下上面四种方法的适用场景和局限性。函数

typeof 用来检测数据类型的运算符学习

使用typeof检测数据类型,返回值是字符串格式。可以返回的数据类型this

是:"number","string","bolean","undefined","function","object"。prototype

<script>
  let arr = [1,2,3];
  let reg = /\w/;
  console.log(arr instanceof Array);  //true
  console.log(arr instanceof Object);  //true
  console.log(reg instanceof RegExp);  //true
  console.log(reg instanceof Object);  //true
</script>

前端全栈学习交流圈:866109386,面向1-3经验年前端开发人员,帮助突破技术瓶颈,提高思惟能力 群内有大量PDF可供自取,更有干货实战项目视频进群免费领取。code

局限性:视频

  • 不能用于检测和处理字面量方式建立出来的基本数据类型值,即原始数据类型
  • instanceof的特性:只要在当前实例的原型链上的对象,咱们用其检测出来都为true
  • 在类的原型继承中,咱们最后检测出来的结果未必正确

constructor 构造函数对象

是函数原型上的属性,该属性指向的是构造函数自己。继承

做用和instsnceof很是类似,与instanceof不一样的是,不只能够处理引用数据类型,还能够处理原始数据类型。token

<script>
  let num = 12;
  let obj = {};
  console.log(num.constructor == Number);//true
  console.log(obj.constructor == Object);//true
</script>

可是要注意一点的是,当直接用(对象字面量或原始数据).constructor时,最好加上()。为了便于理解,咱们来看一个例子。

<script>
  1.constructor === Number;    //报错,Invalid or unexceped token
  (1).constructor === Number;    //true
  {}.constructor === Number;    //报错,Invalid or unexceped token
  ({}).constructor === Number;  //true
</script>

前端全栈学习交流圈:866109386,面向1-3经验年前端开发人员,帮助突破技术瓶颈,提高思惟能力 群内有大量PDF可供自取,更有干货实战项目视频进群免费领取。

这主要是因为js内部解析方式形成的,js会把1.constructor解析成小数,这显然是不合理的,小数点后应该是数字,所以就会引起报错。js会把{}解析成语句块来执行,这时后面出现一个小数点显然也是不合理的,所以也会报错。为了解决这个问题,咱们能够为表达式加上()使js可以正确解析。

局限性:咱们能够把类的原型进行重写,在重写的过程当中极可能把以前constructor给覆盖了,这样检测出来的结果就是不许确的

<script>
   function Fn() {};
  Fn.prototype = new Array;
  var f = new Fn;
  //f是一个函数,按道理说他的构造函数应该是Function,可是修改其原型链后,它的constructor变成了Array.
  console.log(f.constructor == Array);  //true
</script>

Object.prototype.toString.call() 原型链上的Object对象的toString方法

Object.prototype.toString的做用是返回当前方法的执行主体(方法中的this)所属类的详细信息,是最全面也是最经常使用的检测数据类型的方式。

返回值的类型为string类型。

<script> 
  console.log(Object.prototype.toString.call(1));          //[object Number]
  console.log(Object.prototype.toString.call(/^sf/));        //[object RegExp]
  console.log(Object.prototype.toString.call("hello"));      //[object String]
  console.log(Object.prototype.toString.call(true));        //[object Boolean]
  console.log(Object.prototype.toString.call(null));        //[object Null]
  console.log(Object.prototype.toString.call(undefined));      //[object Undefined]
  console.log(Object.prototype.toString.call(function() {}));    //[object Function]
  console.log(typeof(Object.prototype.toString.call(function() {})));    //string
</script>
相关文章
相关标签/搜索