在js中,有四种用于检测数据类型的方式,分别是:
下面我们就来分别详情一下上面四种方法的适用场景和局限性。
typeof 用来检测数据类型的运算符
使用typeof检测数据类型,返回值是字符串格式。能够返回的数据类型
是:"number","string","bolean","undefined","function","object"。
<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可供自取,更有干货实战项目视频进群免费领取。
局限性:
constructor 构造函数
是函数原型上的属性,该属性指向的是构造函数本身。
作用和instsnceof非常类似,与instanceof不同的是,不仅可以解决引用数据类型,还可以解决原始数据类型。
<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>