js判断数据类型四种方法以及优缺点
1 typeof
基本类型:String、Number、Boolean、Null、Undefined、Bigint、Symbol(es6的新数据类型)
引用类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。(感觉没有必要完全记住)
typeof
判断的是基本类型(null返回的是 object
),函数返回 function。
缺点:typeof判断null返回object,
函数返回 function,其余引用类型返回的都是object
知识点延伸:
栈内存和堆内存
栈内存主要用于存储各种基本类型,堆内存主要负责像引用类型的存储。
栈内存:栈会自动分配固定大小内存空间,会自动释放,存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可以共享。
堆内存:动态分配大小不定的内存空间,不会自动释放。
typeof null是Object
js中对象使用二进制存储,二进制前三位都是0,系统会判断为Object类型,而null的二进制全是0,所以判断为Object
这个bug是初版本的JavaScript中留下的,扩展一下其他五种标识位:
000 对象
1 整型
010 双精度类型
100字符串
110布尔类型
Symbol.toStringTag
加上toStringTag属性,自定义的类也会有自定义的类型标签了。
class TestToStringTagClass {
get [Symbol.toStringTag]() {
return "TestToStringTag"
}
}
Object.prototype.toString.call(new TestToStringTagClass())
typeof 结果就是读取对象上面的Symbol.toStringTag属性。
2 instanceof
实现原理
function instanceof(L, R) {
var RP = R.prototype
var LP = L.__proto__
while(true) {
if(LP === null) {
return false
}
if(LP === RP) {
return true
}
LP = LP.__proto__
}
}
A instanceof B
对象的构造函数原型(_proto_隐式原型)是否等于目标对象的原型。
缺点:instanceof 不能完全精确的判断object类的具体数据类型。
3
推广一下自己开发的微信小程序,有兴趣的朋友可以玩一玩