JavaScript类型侦探:四大神器让你一眼看穿变量真身

在JavaScript的江湖中,每个变量都有自己的"身份证",但有些家伙喜欢玩"变脸"。今天,我带大家认识四位顶尖的"类型侦探",帮你识破一切伪装!

侦探档案:四大神探各显神通

1. typeof ------ 初出茅庐的原始类型专家

这位侦探最擅长处理原始类型案件,但总在null面前栽跟头,但是它判断不了引用类型案件:

javascript 复制代码
let n = 123  //number 数字类型
let s = 'hello' // string 字符串类型 
let f = true  //boolean 布尔类型
let u = undefined // undefined 未定义类型
let nu = null  // object 判断失败
let sy = Symbol(1)//symbol类型
let big = 123123123n// bigint类型

let arr = [] //object 失败
let obj = {} //object 失败
let fn = function() {} // function 特例判断成功
let date = new Date() //object 判断失败
console。log(typeof xxx)

typeof会通过将值转化为二进制来判断类型,对于二进制数据前三位是0的统一识别为对象,所有引用类型转化为二进制前三位都是0,而null转化为二进制全是0,null的机器码是全0,所以被判定为对象。

2. instanceof ------ 血统鉴定师

这位侦探专查家族关系,看你是否出自"名门望族":

javascript 复制代码
let n = 123
let s = 'hello'
let f = true
let u = undefined 
let nu = null
let sy = Symbol(1)
let big = 123123123n

let arr = []
let obj = {}
let fn = function() {}
let date = new Date()


console.log(arr instanceof Array);//true
console.log(arr instanceof Object); //  Array.prototype.__proto__ == Object.prototype  true

console.log(obj instanceof Object); //true
console.log(date instanceof Date);  //true
console.log(fn instanceof Function); //true

console.log(n instanceof Number);  // false
console.log(nu instanceof Object);  // false

破案原理:沿着原型链向上找,看你祖上有没有这位"祖先",很显然,这样判断不了原始类型,而且这样还不好判断自己的上一级是不是就是自己的构造函数这是因为实例对象都是new一个构造函数得到的,也就是万物皆对象。

3. Object.prototype.toString.call() ------ 法医鉴定中心

最权威的鉴定机构,能给出最准确的官方报告:

javascript 复制代码
let n = 123
let s = 'hello'
let f = true 
let u = undefined
let nu = null 
let sy = Symbol(1)
let big = 123123123n
let arr = []
let obj = {}
let fn = function () { }
let date = new Date() 
console.log(Object.prototype.toString.call(n));
console.log(Object.prototype.toString.call(s));
console.log(Object.prototype.toString.call(f)); 
console.log(Object.prototype.toString.call(u)); 
console.log(Object.prototype.toString.call(nu)); 
console.log(Object.prototype.toString.call(sy)); 
console.log(Object.prototype.toString.call(big)); 
console.log(Object.prototype.toString.call(arr)); 
console.log(Object.prototype.toString.call(obj)); 
console.log(Object.prototype.toString.call(fn)); 
console.log(Object.prototype.toString.call(date));

这时候的检验结果如下

法医鉴定中心完美地把每个变量的类型展示出来,但是这时候你看这个打印结果就会发现不对劲,怎么前面会有一个object,这是因为这个函数会将this值作为参数传递给ToObject,设o为调用ToObject的结果, 设一个变量class为O的[[class]]内部属性值,返回一个字符串,这个字符串由'[object' +class+ ']'组成,一种结构它的内部属性[[class]]对应的值 就是 创建它的那个构造函数。 如果想要去掉的话,就要用到一个它自身就有的方法slice

javascript 复制代码
function getType(x) {
  const val = Object.prototype.toString.call(x)  // '[object String]'
  const valType = val.slice(8, -1)
  return valType
}
console.log(getType(s));  // String

Object.prototype.toString.call(arr)

slice顾名思义就是直接把你想要的东西剪切出来不影响原来的东西,前面那个数就是从下标多少开始切,后面那个数就是到哪里停止,-1就代表从后往前开始切,这样就能轻松识别变量的身份。

4. Array.isArray() ------ 数组特派员

专门负责数组鉴定,又快又准:

javascript 复制代码
console.log(Array.isArray([]));//true

总结

选择哪种类型判断方法,就像选择不同的工具:

  • 🔧 日常快速判断typeof
  • 🧬 检查继承关系instanceof
  • 🏥 需要精确诊断Object.prototype.toString.call()
  • 📦 专门检查数组Array.isArray()

记住:没有最好的,只有最合适的。下次遇到类型判断问题时,想想我们的四位侦探,选对工具,事半功倍!

相关推荐
Debroon1 小时前
从零开始手写ReAct Agent
前端·javascript·react.js
软件技术NINI1 小时前
html css js网页制作成品——成毅html+css+js 5页附源码
javascript·css·html
Hello.Reader1 小时前
Rocket 0.5 快速上手3 分钟跑起第一个 Rust Web 服务
开发语言·前端·rust
YIN_O1 小时前
openEuler 上 CUDA 与 ROCm 的 GPU 加速实战
前端
CryptoRzz1 小时前
对接墨西哥股票市场 k线图表数据klinechart 数据源API
开发语言·javascript·web3·ecmascript
古城小栈1 小时前
前端安全进阶:有效防止页面被调试、数据泄露
前端·安全·状态模式
chilavert3181 小时前
技术演进中的开发沉思-230 Ajax:Prototype.js 重构原生 DOM
开发语言·前端·javascript
手握风云-1 小时前
JavaEE 进阶第七期:Spring MVC - Web开发的“交通枢纽”(一)
前端·spring·java-ee
CaliXz1 小时前
取出51.la统计表格内容为json数据 api
java·javascript·json