最近又用到了对一个类型进行类型判断,这里对两种判断方法进行一个总结
相同点:
typeof与instanceof都是判断数据类型的方法
区别:
typeof会返回一个变量的基本类型(特殊 typeof null 会为object 但这只是JavaScript 存在的一个悠久 Bug),除了function会被检测出来,其他对象类型都为object,基本类型会反回对应的类型。
下面是一个简单示范
console.log(typeof a); //'undefined'console.log(typeof(true)); //'boolean'console.log(typeof '123'); //'string'console.log(typeof 123); //'number'console.log(typeof NaN); //'number'console.log(typeof null); //'object' var obj = new String();console.log(typeof(obj)); //'object'var fn = function(){};console.log(typeof(fn)); //'function'
typeof原理:js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息:
对象:000 浮点数:010 字符串:100 布尔:110 整数:1 null:全是0(因此会被误以为是对象类型)undefined:用 −2^30 整数来表示因此要避免用typeof 判断null
instanceof返回的是一个布尔值 可以准确的判断复杂的引用类型,但是不能判断基础数据类型
这是因为instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
所以也可以用来判断一个实例对象是不是某个构造函数产生的
var Person = function () {}var p1 = new Person();function isinstance(a, b) {while (a !== null) {if (a.__proto__ === b.prototype) {return true;} else {a = a.__proto__}}return false;}console.log(isinstance(p1, Object));//trueconsole.log(isinstance(p1, Person));//true
如果需要通用检测数据类型,可以采用Object.prototype.tostring
console.log(Object.prototype.toString.call('aa'));//[object,string]
也可以用===
这里会涉及到原型、原型链部分的知识了,有兴趣可以看看我之前的博客
原型、原型链的关系?如何用自己的语言来叙述?_js 把方法挂到docment上_时雨.`的博客-CSDN博客