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

JavaScript系列(74)--反射API详解

JavaScript反射API详解 🔍

JavaScript的反射API提供了强大的运行时检查和操作对象的能力。本文将深入探讨Reflect API的原理、应用场景和最佳实践。

反射基础 🌟

💡 小知识:反射是指程序在运行时能够检查、修改自身结构和行为的能力。JavaScript的Reflect API提供了一组用于控制对象行为的方法,使元编程变得更加简单和规范。

// 基础反射操作
const obj = { name: '张三', age: 25 };// 属性操作
console.log(Reflect.get(obj, 'name'));          // 获取属性
Reflect.set(obj, 'age', 26);                    // 设置属性
console.log(Reflect.has(obj, 'name'));          // 检查属性
Reflect.deleteProperty(obj, 'age');             // 删除属性// 对象操作
const newObj = Reflect.construct(Object, []);   // 构造对象
const proto = Reflect.getPrototypeOf(obj);      // 获取原型
Reflect.setPrototypeOf(newObj, proto);          // 设置原型

Reflect API方法详解 📋

1. 属性操作方法

class PropertyOperations {static demonstratePropertyMethods() {const target = { x: 1, y: 2 };const handler = {get: (target, prop) => {console.log(`访问属性: ${prop}`);return Reflect.get(target, prop);}};const proxy = new Proxy(target, handler);// 属性定义Reflect.defineProperty(target, 'z', {value: 3,writable: true,enumerable: true,configurable: true});// 属性描述符获取const desc = Reflect.getOwnPropertyDescriptor(target, 'z');console.log(desc);// 属性枚举console.log(Reflect.ownKeys(target));  // ['x', 'y', 'z']}
}

2. 函数调用与构造

class FunctionOperations {static demonstrateFunctionMethods() {function greet(name) {return `Hello, ${name}!`;}// 函数调用console.log(Reflect.apply(greet, null, ['张三']));// 构造函数调用class Person {constructor(name) {this.name = name;}}const instance = Reflect.construct(Person, ['张三']);console.log(instance.name);  // '张三'}
}

3. 原型操作

class PrototypeOperations {static demonstratePrototypeMethods() {class Animal {constructor(name) {this.name = name;}}class Dog extends Animal {bark() {return `${this.name} says woof!`;}}const dog = new Dog('旺财');// 获取原型const proto = Reflect.getPrototypeOf(dog);console.log(proto === Dog.prototype);  // true// 设置原型const newProto = {bark() {return `${this.name} says meow!`;  // 狗狗变猫咪了}};Reflect.setPrototypeOf(dog, newProto);}
}

实际应用场景 💼

1. 对象代理与验证

class ValidationProxy {static createValidatedObject() {const validator = {set(target, property, value) {if (property === 'age') {if (!Number.isInteger(value)) {throw new TypeError('年龄必须是整数');}if (value < 0 || value > 150) {throw new RangeError('年龄必须在0-150之间');}}return Reflect.set(target, property, value);}};return new Proxy({}, validator);}
}const person = ValidationProxy.createValidatedObject();
person.age = 25;  // 正常
// person.age = -1;  // 抛出错误

2. 属性监听器

class PropertyObserver {static createObservableObject(target, callback) {return new Proxy(target, {set(target, property, value) {const oldValue = target[property];const result = Reflect.set(target, property, value);if (result && oldValue !== value) {callback(property, oldValue, value);}return result;}});}
}const user = PropertyObserver.createObservableObject({ name: '张三', age: 25 },(property, oldValue, newValue) => {console.log(`${property} changed from ${oldValue} to ${newValue}`);}
);

3. 安全的对象操作

class SafeOperations {static safeGetProperty(obj, prop) {if (Reflect.has(obj, prop)) {return Reflect.get(obj, prop);}return undefined;}static safeSetProperty(obj, prop, value) {try {return Reflect.set(obj, prop, value);} catch (e) {console.error(`Failed to set ${prop}:`, e);return false;}}static safeDeleteProperty(obj, prop) {try {return Reflect.deleteProperty(obj, prop);} catch (e) {console.error(`Failed to delete ${prop}:`, e);return false;}}
}

最佳实践 ⭐

  1. 使用Reflect API替代直接操作
// 不推荐
obj[prop] = value;
delete obj[prop];// 推荐
Reflect.set(obj, prop, value);
Reflect.deleteProperty(obj, prop);
  1. 结合Proxy使用
function createLoggingProxy(target) {return new Proxy(target, {get(target, property) {console.log(`Getting ${property}`);return Reflect.get(target, property);},set(target, property, value) {console.log(`Setting ${property} = ${value}`);return Reflect.set(target, property, value);}});
}
  1. 错误处理
function safeReflection(operation) {try {return operation();} catch (error) {console.error('Reflection operation failed:', error);return null;}
}// 使用示例
safeReflection(() => Reflect.set(obj, 'prop', value));

性能考虑 ⚡

  1. 缓存反射结果
class ReflectionCache {constructor() {this.cache = new WeakMap();}getPropertyDescriptor(target, property) {let targetCache = this.cache.get(target);if (!targetCache) {targetCache = new Map();this.cache.set(target, targetCache);}if (!targetCache.has(property)) {const descriptor = Reflect.getOwnPropertyDescriptor(target, property);targetCache.set(property, descriptor);}return targetCache.get(property);}
}
  1. 避免不必要的反射操作
// 不推荐
function getValue(obj, prop) {return Reflect.get(obj, prop);  // 对简单属性访问使用反射是多余的
}// 推荐
function getValue(obj, prop) {return obj[prop];  // 直接访问更高效
}// 反射适用于需要额外控制或元编程的场景
function getValueWithValidation(obj, prop) {if (!Reflect.has(obj, prop)) {throw new Error(`Property ${prop} does not exist`);}return Reflect.get(obj, prop);
}

总结 📝

JavaScript的反射API提供了:

  1. 统一的对象操作接口
  2. 更安全的对象操作方式
  3. 强大的元编程能力
  4. 与Proxy完美配合的API

💡 学习建议:

  • 深入理解Reflect API的每个方法
  • 掌握反射与代理的结合使用
  • 注意性能影响,避免过度使用
  • 在适当的场景使用反射
  • 始终考虑错误处理

如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

相关文章:

JavaScript系列(74)--反射API详解

JavaScript反射API详解 &#x1f50d; JavaScript的反射API提供了强大的运行时检查和操作对象的能力。本文将深入探讨Reflect API的原理、应用场景和最佳实践。 反射基础 &#x1f31f; &#x1f4a1; 小知识&#xff1a;反射是指程序在运行时能够检查、修改自身结构和行为的…...

轻量级分组加密算法RECTANGLE

轻量级分组加密算法RECTANGLE RECTANGLE轻量级分组密码算法是Wentao Zhang&#xff0c;Zhenzhen Bao,Dongdai Lin等学者于2014年提出的&#xff0c;该算法是SPN结构的&#xff0c;采用了线性移位的置换层以及44bit的S盒。RECTANGLE是一个迭代分组密码&#xff0c;分组长度为64…...

智能设备监控:AI 与 Python 助力设备管理的未来

智能设备监控:AI 与 Python 助力设备管理的未来 引言 随着物联网(IoT)和智能设备的广泛应用,我们的日常生活逐渐离不开这些高科技产品。从智能家居到工业控制,智能设备已经渗透到各个领域。然而,随着设备种类和数量的增加,如何高效地监控这些设备,确保它们的稳定性和…...

python语言进阶之函数

目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…...

Golang Model 字段自动化校验设计

背景 在我们日常开发中&#xff0c;不可避免的总要去进行各种参数校验&#xff0c;但是如果在某个场景中&#xff0c;要校验的字段非常多&#xff0c;并且在其中还有耦合关系&#xff0c;那么我们手写校验逻辑就变得非常的低效且难以维护。本篇文档就基于 DDD 领域模型设计的思…...

Hot100 堆

215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 堆排序 我们可以借助一个小顶堆来维护当前堆内元素的最小值&#xff0c;同时保证堆的大小为 k&#xff1a; 遍历数组将元素入堆&#xff1b; 如果当前堆内元素超过 k 了&#xff0c;我们就把堆顶元素去除…...

AIGC图生视频保姆级教程

一、AI文生图高阶技巧 推荐工具 ▸ MidJourney&#xff08;艺术感最强&#xff09; ▸ DALLE 3&#xff08;与ChatGPT深度联动&#xff09; ▸ Leonardo.ai&#xff08;精细化参数控制&#xff09; 核心策略 提示词架构&#xff1a; [主体描述][环境氛围][镜头语言][风格参数…...

Qt QDateTimeEdit总结

1. 概述 QDateTimeEdit 是 Qt 提供的用于编辑日期和时间的控件&#xff0c;支持直接输入或通过弹出日历/时间选择器调整值。继承自 QAbstractSpinBox&#xff0c;是 QDateEdit 和 QTimeEdit 的父类&#xff0c;可同时处理日期和时间。默认显示格式为系统本地化的日期时间格式&…...

【吾爱出品】 视频批量分段工具

视频批量分段工具 链接&#xff1a;https://pan.xunlei.com/s/VOJDvtHQE7GOiJ84WNea5Ay1A1?pwd5nta# 选择视频文件 启动程序后&#xff0c;点击 "文件" 菜单下的 "选择视频文件" 按钮&#xff0c;或者直接将视频文件拖放到程序窗口中的视频列表区域。支…...

SHEIN的迁移与无奈

日前&#xff0c;因杭州宇树科技、DeepSeek的“六小龙”企业崛起&#xff0c;不少地方开始反思&#xff0c;为什么本地没有留住创始人&#xff0c;或者发展出类似的企业。例如DeepSeek创始人梁文锋和Kimi创始人杨植麟都是广东人&#xff0c;但都在其他地区创业成功。而还有媒体…...

TCP/UDP 简介,三次握手与四次挥手

一、TCP 三次握手 目的&#xff1a;为了解决在不可靠的信道上建立可靠的网络连接 三次握手是连接请求的过程&#xff1a; A 发送连接请求的数据给 B&#xff08;发送 SYN 包&#xff09; B 同意连接&#xff0c;返回数据给 A&#xff08;返回 SYNACK 包&#xff09; A 收到后回…...

Windows Defender Control--禁用Windows安全中心

Windows Defender Control--禁用Windows安全中心 链接&#xff1a;https://pan.xunlei.com/s/VOJDuy2ZEqswU4sEgf12JthZA1?pwdtre6#...

数据仓库与数据湖的协同工作:智慧数据管理的双引擎

数据仓库与数据湖的协同工作:智慧数据管理的双引擎 引言 在数据驱动的今天,企业和组织收集和存储的数据量正以惊人的速度增长。如何高效管理和利用这些数据,成为了决策者和技术专家的共同难题。为了解决这一问题,数据仓库(Data Warehouse)和数据湖(Data Lake)这两种技…...

50. c++多维数组

在‘19 数组’中描述了原生数组的本质和其索引的原理&#xff0c;一维数组是连续的一个内存块&#xff0c;本质就是指针&#xff0c;指向这个内存块的起始位置&#xff0c;索引的原理就是对该指针的操作。通常对数组的操作一种策略就是使用指针&#xff0c;二维数组可以说是数组…...

用大模型学大模型05-线性回归

deepseek.com:多元线性回归的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xff0c;及如何改进解决及改进方法数据推…...

苹果CMS站群插件的自动生成功能:提升网站流量的秘诀

引言 在数字营销的浪潮中&#xff0c;站群技术因其强大的流量引导能力而备受青睐。苹果CMS作为一款优秀的内容管理系统&#xff0c;凭借其灵活性和可扩展性&#xff0c;成为了站群管理的理想选择。本文将详细介绍苹果CMS站群插件的自动生成功能&#xff0c;探讨如何通过这一功…...

大语言模型中one-hot编码和embedding之间的区别?

1. 维度与稀疏性 One-Hot编码 定义&#xff1a;每个词被表示为一个高维稀疏向量&#xff0c;维度等于词汇表大小。例如&#xff0c;词汇表有10,000个词&#xff0c;每个词对应一个10,000维的向量&#xff0c;其中仅有一个位置为1&#xff08;表示当前词&#xff09;&#xff0…...

【Bluedroid】 BLE连接源码分析(一)

BLE链接过程分析见【Bluedroid】BLE连接过程详解-CSDN博客,本篇主要围绕HCI_LE_Create_Connection展开。基于Android14源码进行分析。在蓝牙低功耗技术中,设备之间建立连接是进行数据传输等操作的前提。HCI LE Extended Create Connection Command 提供了一种更灵活、功能更丰…...

【C语言】移除元素

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后…...

SQL与数据库程序设计

1.1986年&#xff0c;10月美国国家标准局颁布了SQL语言的美国标准&#xff0c;称为SQL86 2.SQL(Structured Query Language)又称为结构化查询语言 3.建立索引的主要目的是加快查找的速度 4.在基本表上建立一个或者多个索引 5. 一个基本表是最多只能建立一个聚簇索引 6.CAL…...

基于Java企业项目管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

Blazor-设置组件焦点

在Razor中设置焦点我们需要用到ElementReference类型的变量&#xff0c;使用ref指令引用到设置焦点HTML的元素。 在Blazor中&#xff0c;ElementReference类型的作用是提供对HTML DOM元素的引用&#xff0c;以便在C#代码中通过JavaScript互操作&#xff08;JS Interop&#xff…...

信用违约掉期(Credit Default Swap, CDS):金融市场的“保险”还是“定时炸弹”?(中英双语)

信用违约掉期&#xff08;CDS&#xff09;&#xff1a;金融市场的“保险”还是“定时炸弹”&#xff1f; 引言 信用违约掉期&#xff08;Credit Default Swap, CDS&#xff09; 是金融市场中一种重要的衍生品&#xff0c;它最初被设计为债务违约的保险工具&#xff0c;但在实…...

Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力

摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案&#xff0c;涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例&#xff0c;展示如何将前沿AI技术转化为实际生产力。教程支持Lin…...

核货宝多语言订货系统:打破语言障碍,拓展全球市场

在经济全球化的大背景下&#xff0c;企业的业务版图不断向全球扩张&#xff0c;国际贸易活动日益频繁。对于众多从事跨境贸易、跨国批发零售以及拥有广泛海外客户群体的企业而言&#xff0c;一款能够跨越语言障碍的多语言订货系统&#xff0c;已成为其在全球市场竞争中脱颖而出…...

【prompt示例】智能客服+智能质检业务模版

本文原创作者&#xff1a;姚瑞南 AI-agent 大模型运营专家&#xff0c;先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗&#xff1b;多年人工智能行业智能产品运营及大模型落地经验&#xff0c;拥有AI外呼方向国家专利与PMP项目管理证书。&#xff08;转载需经授权&am…...

在linux系统中安装Anaconda,并使用conda

系统 : ubuntu20.04 显卡&#xff1a;NVIDIA GTX1650 目录 安装Anaconda第一步&#xff1a;下载合适版本的Anconda1. 查看自己Linux的操作系统及架构命令&#xff1a;uname -a2. 下载合适版本的Anconda 第二步&#xff1a;安装Aanconda1. 为.sh文件设置权限2. 执行.sh文件2.1 .…...

基于 openEuler 构建 LVS-DR 群集

1、环境准备 准备好下面四台台服务器&#xff1a; 主机名IP角色openEuler-1192.168.121.11Director ServeropenEuler-2192.168.121.12Real Server1openEuler-3192.168.121.13Real Server2Rocky8192.168.121.51Client 2、Web服务器配置 在两台RS上安装并配置nginx服务&#…...

委托构造函数与继承构造函数

委托构造函数 允许同一类中的构造函数调用另一个构造函数&#xff0c;以复用初始化逻辑。 委托构造函数不能同时初始化成员变量&#xff0c;只能委托给其他构造函数。 避免循环委托&#xff08;如构造函数A委托给B&#xff0c;B又委托给A&#xff09;。 class MyClass { pu…...

EPLAN 自定义图框

一 &#xff0c; 还是先打开系统自带的图框&#xff0c;作为参考 二&#xff0c; 自定义图框 1. 新建图框 2. 绘制。下图描述有误&#xff0c;直接将系统默认图框文件复制&#xff0c;然后重命名&#xff0c;在这个基础上来进行编辑。 三&#xff0c; 使用 1. 更改默认图框 2…...

c++ gcc工具链

GCC&#xff08;GNU Compiler Collection&#xff09;是一套广泛使用的开源编译工具链&#xff0c;支持多种编程语言&#xff08;如 C、C、Objective-C、Fortran 等&#xff09;&#xff0c;主要用于 Linux 和嵌入式开发环境。 组成 GCC 工具链主要由以下几个核心工具组成&am…...

基于51单片机的的鸡笼补光和恒温系统的设计与实现(源程序+Protues仿真+电路图+元件清单+器件手册)

编号&#xff1a;71 基于51单片机的的鸡笼补光和恒温系统的设计与实现 功能描述&#xff1a; 本设计由89C52单片机液晶12864显示模块声光报警电路温湿度传感器电路风扇电路LED照明电路光照检测电路GSM电路DS1302时钟电路 1.实现的功能 (1)采用DHT11温湿传感器、光敏电阻捕捉…...

es-head 正则查询和标准正则查询的差异

在es-head里面查询&#xff0c;需要查询字符串是一个json串&#xff0c;因此就要符合json串的格式&#xff0c;在es-head里面可以通过regexp做正则查询&#xff0c;而这里的正则表达式其实是写成字符串的形式的&#xff0c;因此就要面对字符串转义的问题&#xff0c;比如你想匹…...

【深度学习】深度学习和强化学习算法——深度 Q 网络DQN

深度 Q 网络&#xff08;Deep Q-Network, DQN&#xff09; 详解 什么是DQNDQN 的背景DQN 训练流程 2 DQN 的核心思想2.1 经验回放&#xff08;Experience Replay&#xff09;2.2 目标网络&#xff08;Target Network&#xff09;2.3 ε-贪心策略&#xff08;ε-Greedy Policy&a…...

matlab模拟风场的随机脉动风

1、内容简介 matlab137-模拟风场的随机脉动风 可以交流、咨询、答疑 2、内容说明 略 模拟风场的随机脉动风&#xff0c;并进行相关的统计分析和计算&#xff0c;包括风速谱、空间相关性、自谱、互谱、以及POD&#xff08;Proper Orthogonal Decomposition&#xff09;分解等…...

2025年2月16日(numpy-deepseek)

嗯&#xff0c;用户让我介绍一下这段使用numpy的代码。首先&#xff0c;我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学&#xff0c;所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np&#xff0c;这应该是导入numpy库&#xff0c;并…...

x64和ARM的区别

x64和ARM是两种不同的处理器架构&#xff0c;它们在指令集、设计理念、应用场景和能耗效率等方面存在显著差异。以下是它们之间的主要区别&#xff1a; 1. **指令集架构**&#xff1a; * **x64**&#xff1a;x64架构&#xff0c;也称为x86-64或AMD64&#xff0c;是x86架…...

电解电容的参数指标

容量 这个值通常是室温25℃&#xff0c;在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压&#xff0c;通常要求降额使用。 例如额定电压是4V&#xff0c;降额到70%使用&#xff0c;最高施…...

如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题

在安装Qt时&#xff0c;遇到了一些问题&#xff0c;尤其是在Mac上安装Qt后&#xff0c;发现Qt Creator没有出现在应用程序中。通过一些搜索和操作&#xff0c;最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后&#xff0c;启动应用程…...

Spring——Spring开发实战经验(1)

摘要 文章主要介绍了 Swagger 作为 API 文档生成和测试工具的功能&#xff0c;包括自动生成 API 文档、提供可视化调试界面、促进前后端协作、支持 OpenAPI 规范等。同时&#xff0c;还提及了 Spring Boot 与 Swagger3 的实战应用&#xff0c;以及 Spring 开发中其他相关技术内…...

设计模式:代理模式

代理模式是很常见的设计模式&#xff0c;即使没有专门学习过这种设计模式&#xff0c;在工作中也一定用过这种设计模式。在实际生活中&#xff0c;代理模式也是常见的&#xff0c;比如内阁首辅相对于皇帝&#xff0c;前者是后者的代理&#xff0c;内阁首辅收到奏折时&#xff0…...

【NLP】循环神经网络RNN

目录 一、认识RNN 二、RNN模型分类 三、传统RNN模型 3.1 结构分析 3.2 Pytorch构建RNN模型 3.3 优缺点 一、认识RNN RNN(Recurrent Neural Network)&#xff0c;中文称作循环神经网络&#xff0c;一般以序列数据为输入&#xff0c;通过网络内部的结构设计有效捕捉序列之…...

深度解析HTTP/HTTPS协议:从原理到实践

深入浅出HTTP/HTTPS协议&#xff1a;从原理到实践 前言 在当今互联网世界中&#xff0c;HTTP和HTTPS协议如同空气般存在于每个网页请求的背后。作为开发者或技术爱好者&#xff0c;理解这些基础协议至关重要。本文将用六大板块&#xff0c;配合原理示意图和实操案例&#xff0…...

AF3 MmcifObject类解读

AlphaFold3 中 MmcifObject类 是 解析 mmCIF 文件的核心数据结构,用于存储解析后的蛋白质结构信息,包含PDB 头部信息、Biopython 解析的结构、链序列信息等。 下面代码包含 Monomer 、AtomSite、ResiduePosition、ResidueAtPosition、 MmcifObject以及ParsingResult数据类的…...

大数据SQL调优专题——Hive执行原理

引入 Apache Hive 是基于Hadoop的数据仓库工具&#xff0c;它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中&#xff0c;HQL默认转换成MapReduce程序运行到Yarn集群中&#xff0c;大大降低了非Java开发者数据分析的门槛&#xff0c;并且Hive提供命令…...

MySQL常见错误码及解决方法(1130、1461、2003、1040、2000、1049、1062、1129、2002、1690等)

目录 【问题1】、FATAL: error 1130: Unknown error 1130 【问题2】、FATAL: error: 1461 【问题3】、ERROR 2003 (HY000): Cant connect to MySQL server on "" (113) 【问题4】、FATAL: error 2003: Cant connect to MySQL server on 172.19.111.151 (111) 【问…...

类和对象详解(下)-----运算符重载

目录 1.运算符重载 2.赋值运算符重载 3.取地址运算符重载 3.1const成员函数 3.2取地址运算符重载 1.运算符重载 什么是运算符重载呢&#xff1f;简单举个例子就懂了。 就是我想实现日期的加法&#xff0c;而“”这个运算符C只实现了内置类型的加法&#xff0c;而我们要想实…...

Visonpro 检测是否有缺齿

一、效果展示 二、上面是原展开工具CogPolarUnwrapTool&#xff1b; 第二种方法&#xff1a; 用Blob 和 CogCopyRegionTool 三、 用预处理工具 加减常数&#xff0c;让图片变得更亮点 四、圆展开工具 五、模板匹配 六、代码分解 1.创建集合和文子显示工具 CogGraphicCollec…...

(萌新入门)如何从起步阶段开始学习STM32 ——2 我应该学习HAL库还是寄存器库?

概念 笔者下面需要介绍的是库寄存器和HAL库两个重要的概念&#xff0c;在各位看完之后&#xff0c;需要决定自己的学习路线到底是学习HAL呢&#xff1f;还是寄存器呢&#xff1f;还是两者都学习呢&#xff1f; 库寄存器 库寄存器就是简单的封装了我们对寄存器的操作&#xf…...

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里&#xff0c;SQL 是不可或缺的工具。不同的数据库系统&#xff0c;如 MySQL、PostgreSQL&#xff08;PG&#xff09;、Doris 和 Hive&#xff0c;在架构和性能特点上存在差异&#xff0c;因此针对它们的 SQL 优化策略也各有不同。这些数据库…...