JavaScript判断数据类型方法?
1.typeof
目前只能返回8种数据类型string,number,boolean,symbol,bigint,unfined,object,function
typeof(null) 结果为object
symbol:
ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
bigint:
数据类型的目的是比数据类型支持的范围更大的整数值。在对大整数执行数学运算时,以任意精度表示整数的能力尤为重要。使用bigint整数溢出将不再是问题。
2.instanceof
一般用来判断引用数据类型
var arr = [1,2,3]
console.log(arr instanceof Array)
//true
instanceof原理
用于判断某个实例是否属于某构造函数
在继承关系中用来判断一个实例是否属于它的父类型或者祖先类型的实例
说白了,只要右边变量的 prototype 在左边变量的原型链上即可。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false
function self_instanceof(lVal,rVal){ // 验证如果为基本数据类型,就直接返回false const baseType = ['string', 'number','boolean','undefined','symbol'] if(baseType.includes(typeof(lVal))) {
return false
} let RP = rVal.prototype; //取 R 的显示原型 lVal = lVal.__proto__; //取 L 的隐式原型 while(true){ // 无线循环的写法(也可以使 for(;;) ) if(lVal === null){ //找到最顶层 return false; } if(lVal === RP){ //严格相等 return true; } lVal = lVal.__proto__; //没找到继续向上一层原型链查找 } }
3.Object.prototype.toString.call()
这是最为准确的方法
Object.prototype.toString.call(m)
Object.prototype.toString.call("jerry"); //[object String]
Object.prototype.toString.call(12); //[object Number]
Object.prototype.toString.call(true); //[object Boolean]
Object.prototype.toString.call(undefined); //[object Undefined]
Object.prototype.toString.call(null); //[object Null]
Object.prototype.toString.call({name: "jerry"}); //[object Object]
Object.prototype.toString.call(function(){}); //[object Function]
Object.prototype.toString.call([]); //[object Array]
Object.prototype.toString.call(new Date); //[object Date]
Object.prototype.toString.call(/\d/); //[object RegExp]
function Person(){};
Object.prototype.toString.call(new Person); //[object Object]
原理:
在toString方法被调用时,会执行下面的操作步骤:
1. 获取this对象的[[Class]]属性的值.
2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串.
3. 返回第二步的操作结果Result(2).
[[class]]是什么?
是这么定义的:一个字符串值,表明了该对象的类型
原生对象的[[class]]内部属性的值一共有10种.分别是:"Array", "Boolean", "Date", "Error", "Function", "Math", "Number", "Object", "RegExp", "String".
为什么需要Object原型上的toString方法?
在JavaScript中,所有类都继承于Object,因此toString()方法应该也被继承了,其实各数据类型使用toString()后的结果表现不一的原因在于:所有类在继承Object的时候,改写了toString()方法。 Object原型上的方法是可以输出数据类型的。因此我们想判断数据类型时,也只能使用原始方法。继而有了此方法:Object.prototype.toString.call(obj)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构