1.typeof
用法:typeof '123' === 'string'
缺点:只能判断基础数据类型(除null以外),如果是引用数据类型(如数组、函数、对象等)会返回Object
!!! !!! 因为typeof是直接在计算机里面基于二进制值进行检测的,也就是数据类型都是二进制值,对象存储在计算机中,二进制的值都是以000开头,而null值为000,所以typeof(null)为object
2.instanceof
用法:'123' instanceof String
缺点:无法检测基础数据类型,因为instanceof是检测当前判断的类是否出现在实例的原型对象,会循着原型链寻找,所以我们可以改变原型链的指向导致数据类型不准确;
3.constructor
用法:'123'.constructor === String
缺点:constructor可以改变,会导致判断不准确;
4.Object.prototype.toString.call()
用法:Object.prototype.toString.call('123');
缺点:写起来比较麻烦;
!!! !!! 此方法是检测数据类型最准确的方法
总结
① typeof只能检测基本数据类型(除null),对于数组、对象、正则等引用数据类型都返回为Object;
② instanceof不能检测基本数据类型,检测引用类型时会顺着原型链往上找,只要原型链上有的,都返回true,同时,可以随意更改原型链的指向,导致检测结果不准确;
③ constructor可以检测基本数据类型,也能分辨出数组和对象,但是我们可以随意更改constructor的值,导致检测结果不准确;
④ Object.prototype.toString.call(待检测值)是最标准的;