引言
在JavaScript的世界中,类型判断是开发过程中不可或缺的一环。它不仅是理解代码行为的关键,更是构建健壮程序的基石。从简单的数据类型到复杂的对象结构,类型判断贯穿着整个开发过程,影响着程序的稳定性和可维护性。本专栏将带您深入探寻JavaScript类型判断的奇妙世界,揭开类型转换的神秘面纱,探讨最佳实践和解决方案,并助您在类型判断的海洋中游刃有余。让我们一起探索这个引人入胜的话题,开启一场JavaScript类型之旅吧!
type of
我们先来看 typeof 的用法 我们使用typeof XXX 或者 typeof(XXX) 的方式来调用typeof方法 typeof 是用来判断原始类型的方法(除null),并且可以判断function
为什么typeof方法只能判断原始类型(除null)?
我们的原始类型和引用类型都是由一连串的二进制组成的,原始类型的二进制码前三位都为0
而引用类型前三位不全为0,于是区分开了引用类型和原始类型
那么为什么null为原始类型但是却判断不了呢?
因为创建js的大佬们在定义null的时候,将null的二进制码设置为全为0,于是typeof方法就无法分辨出null了
为什么typeof方法又可以判断function类型呢?
typeof 方法能够判断 function 的类型,是因为在 JavaScript 中,函数被视为一种特殊的对象。函数不仅可以拥有属性和方法,而且可以被赋值给变量,作为参数传递,甚至被作为返回值返回,这些特性使得函数在 JavaScript 中表现出类似于对象的行为
//原始类型
let str = 'hello'//String
let num = 123 //number
let flag = false //boolean
let und = undefined //undefined
let nu = null //null
let big = 123n//bigInt
let s = Symbol('hello')//Symbol 用来定义独一无二的值
//引用类型
let obj = {}
let arr = []
let fn = function(){}
let date = new Date()
//判断类型
console.log(typeof str)//type of(str)
console.log(typeof num)
console.log(typeof flag)
console.log(typeof und)
console.log(typeof nu)
console.log(typeof big)
console.log(typeof s)
我们再来看代码运行的结果 :
果然,在null这一栏显示的答案并不是null,而是object
instence of
我们再来看instence of方法
//原始类型
let str = 'hello'//String
let num = 123 //number
let flag = false //boolean
let und = undefined //undefined
let nu = null //null
let big = 123n//bigInt
let s = Symbol('hello')//Symbol 用来定义独一无二的值
//引用类型
let obj = {}
let arr = []
let fn = function(){}
let date = new Date()
//判断
console.log(obj instanceof Object);
console.log(arr instanceof Array);
console.log(fn instanceof Function);
console.log(date instanceof Date);//instanceof 可以判断所有引用类型
console.log(str instanceof String);//false instanceof 无法判断原始类型
console.log(arr instanceof Object);//true
看运行结果
细节
小伙伴们思考一下,要是我们判断 一个arr instanceof Object 结果会是怎样的呢?
我们可以看到,答案是true!那为什么会出现这种现象呢?
原来是因为instanceof在判断类型时,会进行类似以下操作
只要我找不到相应的类型,就会一直向上找,直到为空还没找到,就会返回false 否则返回true
function instanceOF(L,R){
let left = L.__proto__
let right = R.prototype
while(left !== null){
if(left === R.prototype){
return true
}else{
if(left === right) return true
left = left.__proto__
}
}
return false
}
结尾
本文我们探索了typeof 和 instanceof 方法来判断类型,但是我们发现不管是typeof还是instanceof都不是很完美,下一节我将为大家带来一个完美的类型判断方法,欲听后事如何,请点关注加收藏!