当前位置: 首页 > news >正文

检查一个值 val 是否是特定类型的对象

const toString = Object.prototype.toString;

export function is(val: unknown, type: string) {
  return toString.call(val) === `[object ${type}]`;
}

这段代码定义了一个名为 is 的函数,用于检查一个值 val 是否是特定类型的对象。这个函数利用了 Object.prototype.toString 方法来获取值的内部 [[Class]] 属性,并将其格式化为一个字符串,以便与期望的类型进行比较。

这里是函数的详细解释:

  1. toString 变量:首先,通过 const toString = Object.prototype.toString; 语句,将 Object.prototype.toString 方法赋值给局部变量 toString。这样做是为了在函数内部方便调用,并且避免在调用时因为 this 值不正确而导致的问题(尽管在这个特定的使用场景中,this 值不会影响 Object.prototype.toString 的行为,但这是一种常见的最佳实践)。

  2. is 函数export function is(val: unknown, type: string) 定义了一个导出的函数 is,它接受两个参数:val(要检查的值)和 type(期望的类型名称,如 "Array""Object""String" 等)。

  3. 类型检查:在函数体内,通过调用 toString.call(val) 获取 val 的内部 [[Class]] 属性,并将其格式化为一个字符串。然后,这个字符串与模板字符串 [object ${type}] 生成的字符串进行比较。如果它们相等,说明 val 是期望的类型。

  4. 返回值:函数返回一个布尔值,表示 val 是否是指定类型的对象。

  5. 使用 TypeScript:函数使用了 TypeScript 的类型注解。val: unknown 表示 val 可以是任何类型的值,这是一种安全的做法,因为它不假设 val 的任何具体类型。type: string 表示 type 参数应该是一个字符串,即类型的名称。

  6. 使用场景:这个函数可以用于各种类型检查场景,特别是在处理不确定类型的数据时。与直接使用 instanceof 操作符相比,这种方法更可靠,因为它不受原型链修改的影响。

  7. 示例

 

typescript复制代码

console.log(is([], 'Array')); // true
console.log(is({}, 'Object')); // true
console.log(is('hello', 'String')); // true
console.log(is(123, 'Number')); // true
console.log(is(true, 'Boolean')); // true
console.log(is(null, 'Null')); // false,因为 null 不是一个对象,没有 [[Class]] 属性
console.log(is(undefined, 'Undefined')); // false,同样因为 undefined 不是一个对象

注意,对于原始类型(如 stringnumberboolean)和特殊值(如 null 和 undefined),虽然这个函数在格式上保持一致,但实际上这些值并不是对象,因此它们的内部 [[Class]] 属性(如果存在的话)不会以这种方式暴露出来。在 JavaScript 中,原始值和特殊值通常通过严格相等运算符(===)进行检查。然而,对于对象和数组等引用类型,这个函数提供了一种更可靠的类型检查方法。

相关文章:

  • Java 数组相关知识点
  • 用不了 Manus ?其实你能用 Llama或DeepSeek 做个自己的 AI Agent
  • 剑指 Offer II 065. 最短的单词编码
  • 没有最好的,只有最合适的:重新认识测试工具的价值
  • SAP S/4HANA Cloud Private Edition 2023 FPS03:AI助力业务创新
  • 洛谷 P2010 [NOIP 2016 普及组] 回文日期 Python
  • RocketMQ 详细教程(Spring Boot Spring Cloud Alibaba)
  • 靶场练习ing
  • 【A2DP】蓝牙A2DP协议剖析:从架构到规范
  • Linux进程基础知识
  • APIC 是什么?深度解析高级可编程中断控制器
  • Redis-配置文件
  • 【论文精读】Deformable DETR:用于端到端目标检测的可变形 Transformer
  • [Ai 力扣题单] 数组基本操作篇 27/704
  • 深陷帕金森困境,怎样重燃生活信心?
  • 基于 Vue 的Deepseek流式加载对话Demo
  • 网络安全基础知识:从零开始了解网络安全
  • 【网络协议】应用层协议HTTPS
  • C语言学习笔记-进阶(10)自定义类型:结构体
  • # linux有哪些桌面环境?有哪些显示服务器协议及显示服务器?有哪些用于开发图形用户界面的工具包?
  • 网站seo诊断优化分析该怎么做/百度热搜榜第一
  • 江苏SEO网站建设/google seo怎么优化
  • 罗湖建网站公司/北京网络推广公司
  • 电脑做网站怎么解析域名/app推广方案范例
  • 吴江住房城乡建设局网站/国家大事新闻近三天
  • 咸阳兼职做网站/东营优化路网