ES6-Symbol
ES6 中的 Symbol: 独特的数据类型与强大应用
引言
在 JavaScript 的发展长河中,ES6(ECMAScript 2015)无疑是一座重要的里程碑,带来了诸多令人瞩目的新特性。其中,Symbol 类型的引入,为 JavaScript 开发者们开启了一扇全新的大门,它为解决传统开发中遇到的一系列棘手问题提供了创新的方案。Symbol 作为一种独一无二的基本数据类型,以其独特的性质和广泛的应用场景,极大地提升了代码的健壮性、可维护性以及安全性。在这篇博客中,我们将全方位、深层次地探索 ES6 中的 Symbol,从其基础概念到复杂的高级应用,力求为大家呈现一个完整而清晰的 Symbol 知识体系。
Symbol 的作用
解决属性名冲突难题
在传统的 JavaScript 开发过程中,尤其是在多人协作或者使用第三方库的复杂项目里,对象属性名冲突是一个令人头疼的常见问题。不同的模块或者代码片段可能会不经意地使用相同的属性名,这往往会导致意想不到的错误和难以调试的问题。Symbol 的出现,为这个难题提供了完美的解决方案。由于每个 Symbol 都是独一无二的,无论在何处创建,它都不会与其他 Symbol 重复。这就意味着,当我们使用 Symbol 作为对象的属性名时,能够确保属性名的唯一性,从而有效避免属性名冲突。例如,在一个大型项目中,多个模块可能都需要向某个公共对象添加特定的属性,使用 Symbol 作为属性名,各个模块之间就不会因为属性名相同而产生冲突,极大地提高了代码的稳定性。
实现对象的有效封装
封装是面向对象编程中的重要概念,它能够将对象的内部状态和实现细节隐藏起来,只对外提供必要的接口。在 JavaScript 中,利用 Symbol 可以实现对象的内部属性封装。由于 Symbol 属性不能通过常规的对象遍历方法(如for...in、Object.keys())获取,我们可以创建一些不希望被外部随意访问或修改的对象内部属性。这些内部属性只有在对象内部的方法中才能被访问和操作,从而增强了对象的封装性和安全性。比如,我们可以创建一个包含敏感信息的对象,将这些敏感信息的属性名设置为 Symbol 类型,这样外部代码就无法轻易地获取或修改这些敏感信息,保护了对象的内部状态。
拓展对象功能与增强代码可读性
Symbol 还为拓展对象的功能提供了一种优雅的方式。在不修改现有对象原型的前提下,我们能够使用 Symbol 为对象添加额外的功能。这在处理第三方库的对象时尤为有用,我们可以在不影响其原有结构和其他代码使用的情况下,为对象增添新的行为。同时,使用 Symbol 作为事件类型或者模块间的唯一标识等,可以使代码更加清晰、易读。例如,在事件驱动编程中,使用 Symbol 作为事件类型,能够避免与其他可能定义的事件类型发生冲突,并且从代码中可以直观地看出事件的唯一性,增强了代码的可读性和可维护性。
Symbol () 方法
创建唯一的 Symbol 值
创建一个 Symbol 非常简单,通过调用Symbol()函数即可。如下所示:
let sym = Symbol();console.log(typeof sym); // "symbol"
这里,Symbol()函数返回一个全新的、唯一的 Symbol 值。typeof操作符用于检测数据类型,当应用于通过Symbol()创建的变量时,会返回"symbol",表明它是一种新的数据类型。
注意:Symbol是一种原始数据类型,并不是一种构造函数,不能new
使用描述参数增加可读性
Symbol()函数可以接受一个可选的字符串参数,这个参数作为对该 Symbol 的描述,主要用于在调试或打印输出时进行区分,方便开发者理解该 Symbol 的用途。例如:
let sym1 = Symbol('description');let sym2 = Symbol('description');console.log(sym1 === sym2); // false
尽管sym1和sym2的描述相同,但它们仍然是两个完全不同的 Symbol 值。这个描述参数并不会影响 Symbol 的唯一性,只是为了在开发过程中提供更多的上下文信息,帮助开发者更好地理解代码的意图。
注意:Symbol的描述只是对于这个Symbol值的描述,并不是它的值,真正的值存在内存里面,无法被看到
Symbol 与其它数据类型的转换关系和运算关系
与字符串的转换
Symbol 不能直接转换为字符串,这是为了保持其唯一性和特殊性。如果尝试将 Symbol 与字符串进行连接操作,会导致类型错误。例如:
let sym = Symbol('test');let result = sym + 'string'; // TypeError: can't convert symbol to string
然而,如果确实需要将 Symbol 转换为字符串形式进行显示,可以使用Symbol.prototype.toString()方法。该方法会返回一个包含 Symbol 描述的字符串。例如:
let sym = Symbol('test');let str = sym.toString();console.log(str); // "Symbol(test)"
与数字的转换
Symbol 与数字之间也不存在直接的转换关系。不能将 Symbol 当作数字进行数学运算,如加法、减法等。例如:
let sym = Symbol('test');let num = 5 + sym; // TypeError: can't convert symbol to number
这是因为 Symbol 表示的是独一无二的值,其语义与数字完全不同,不适合进行常规的数学运算。
与布尔值的关系
在 JavaScript 中,Symbol 类型的值在布尔运算中被视为真值。也就是说,当 Symbol 类型的值出现在需要布尔值的上下文中(如if语句、while循环条件等)时,会被当作true处理。例如:
let sym = Symbol('test');if (sym) {console.log('Symbol is truthy');}
上述代码会输出Symbol is truthy,表明 Symbol 在布尔运算中表现为真值。
如何在对象里面使用 Symbol 类型的变量作为属性名
避免属性名冲突的应用
在对象中使用 Symbol 作为属性名是其最常见的应用之一,主要用于避免属性名冲突。例如:
let obj = {};let sym1 = Symbol('prop1');let sym2 = Symbol('prop2');obj[sym1] = 'value1';obj[sym2] = 'value2';console.log(obj[sym1]); // "value1"console.log(obj[sym2]); // "value2"
在这个例子中,我们创建了一个空对象obj,然后使用两个不同的 Symbol 作为属性名,分别为其赋值。由于 Symbol 的唯 一性,即使有其他代码也尝试向obj对象添加名为prop1或prop2的属性(假设使用的也是 Symbol 类型),也不会与现有的属性产生冲突。这样,在复杂的项目中,不同模块对同一对象进行属性添加时,使用 Symbol 可以确保各个属性的独立性和唯一性。
实现对象内部属性的封装
通过将 Symbol 类型的变量作为对象的属性名,还可以实现对象内部属性的封装。例如:
let myObject = (function () {let internalProp = Symbol('internal');let obj = {setValue(value) {this[internalProp] = value;},getValue() {return this[internalProp];}};return obj;})();myObject.setValue(42);console.log(myObject.getValue()); // 42// 无法直接访问内部属性console.log(myObject[Symbol('internal')]); // undefined
在上述代码中,我们在一个立即执行函数表达式内部创建了一个 Symbol 类型的变量internalProp,并将其作为obj对象的内部属性名。obj对象提供了setValue和getValue方法来间接操作这个内部属性。由于外部代码无法直接获取到internalProp这个 Symbol,所以不能直接访问或修改该内部属性,从而实现了对象内部属性的封装,提高了对象的安全性和可维护性。
Symbol 的几个常用属性和方法
description 属性
每个 Symbol 实例都有一个只读的description属性,它返回创建 Symbol 时传入的描述字符串。如果创建 Symbol 时没有提供描述字符串,description属性的值为undefined。例如:
let sym1 = Symbol('test description');console.log(sym1.description); // "test description"let sym2 = Symbol();console.log(sym2.description); // undefined
description属性主要用于在调试和日志记录中,帮助开发者快速了解 Symbol 的用途和含义。通过查看description属性的值,开发者可以更清晰地理解代码中各个 Symbol 的作用,尤其是在复杂的项目中,众多的 Symbol 可能会让代码阅读变得困难,description属性能够提供关键的上下文信息。(描述只是描述!!)
Object.getOwnPropertySymbols () 方法
由于正常的遍历方法无法获取Symbol数据类型的属性,故有如下方法获取
Object.getOwnPropertySymbols()方法用于获取一个对象的所有 Symbol 类型的自有属性(即直接在该对象上定义的属性,而不是从原型链继承的属性)。该方法返回一个包含所有 Symbol 属性的数组。例如:
let obj = {};let sym1 = Symbol('prop1');let sym2 = Symbol('prop2');obj[sym1] = 'value1';obj[sym2] = 'value2';let symbols = Object.getOwnPropertySymbols(obj);console.log(symbols); // [Symbol(prop1), Symbol(prop2)]
在这个例子中,我们首先创建了一个对象obj,并使用两个 Symbol 作为属性名向其添加了属性。然后,通过Object.getOwnPropertySymbols()方法获取obj对象的所有 Symbol 类型的自有属性,返回的数组包含了我们之前定义的sym1和sym2。这个方法在需要遍历对象的所有 Symbol 属性时非常有用,比如在进行对象的深度克隆或者对对象的所有属性(包括 Symbol 属性)进行统一处理时。
Reflect.ownKeys () 方法
Reflect.ownKeys()方法返回一个包含对象自身所有属性键(包括字符串类型和 Symbol 类型)的数组。与Object.getOwnPropertyNames()方法不同,Object.getOwnPropertyNames()方法只能获取对象的字符串类型的自有属性键,而Reflect.ownKeys()方法可以获取所有类型的自有属性键。例如:
let obj = {};let sym1 = Symbol('prop1');let sym2 = Symbol('prop2');obj[sym1] = 'value1';obj[sym2] = 'value2';obj.stringProp = 'string value';let keys = Reflect.ownKeys(obj);console.log(keys); // [Symbol(prop1), Symbol(prop2), "stringProp"]
在上述代码中,我们创建了一个对象obj,包含两个 Symbol 类型的属性和一个字符串类型的属性。通过Reflect.ownKeys()方法,我们获取到了obj对象的所有自有属性键,包括 Symbol 类型和字符串类型。
Symbol.for () 和 Symbol.keyFor () 方法
Symbol.for () 方法
Symbol.for()方法用于在全局 Symbol 注册表中搜索具有指定键的 Symbol。如果找到了匹配的 Symbol,则返回该 Symbol;如果没有找到,则在全局 Symbol 注册表中创建一个新的 Symbol,并返回它。与直接使用Symbol()函数创建 Symbol 不同,Symbol.for()创建的 Symbol 是全局共享的,只要键相同,无论在何处调用Symbol.for(),返回的都是同一个 Symbol。例如:
let sym1 = Symbol.for('globalSymbol');let sym2 = Symbol.for('globalSymbol');console.log(sym1 === sym2); // true
在这个例子中,我们两次调用Symbol.for('globalSymbol'),尽管是在不同的代码位置,但由于使用了相同的键'globalSymbol',所以sym1和sym2指向的是同一个 Symbol。这种全局共享的特性使得 Symbol 在不同模块或者不同作用域之间能够实现统一的标识,在大型项目中,当需要在多个地方使用相同的唯一标识时,Symbol.for()非常有用。
此时描述就不再只是起描述的作用了,还起到值的作用
Symbol.keyFor () 方法
Symbol.keyFor()方法用于返回一个已登记的 Symbol 在全局 Symbol 注册表中的键。它接受一个 Symbol 作为参数,如果该 Symbol 是通过Symbol.for()方法在全局 Symbol 注册表中创建的,则返回其对应的键;如果该 Symbol 不是通过Symbol.for()方法创建的(例如直接使用Symbol()函数创建的),则返回undefined。例如:
let sym1 = Symbol.for('globalSymbol');let key = Symbol.keyFor(sym1);console.log(key); // "globalSymbol"let sym2 = Symbol('localSymbol');let key2 = Symbol.keyFor(sym2);console.log(key2); // undefined
在上述代码中,对于通过Symbol.for()创建的sym1,Symbol.keyFor()方法返回了其在全局 Symbol 注册表中的键'globalSymbol'。而对于直接使用Symbol()创建的sym2,由于它不在全局 Symbol 注册表中,所以Symbol.keyFor()方法返回undefined。Symbol.keyFor()方法在需要根据 Symbol 获取其对应的全局键时非常有用,比如在进行全局 Symbol 的管理或者在不同模块之间进行基于键的 Symbol 查找时。
相关文章:
ES6-Symbol
ES6 中的 Symbol: 独特的数据类型与强大应用 引言 在 JavaScript 的发展长河中,ES6(ECMAScript 2015)无疑是一座重要的里程碑,带来了诸多令人瞩目的新特性。其中,Symbol 类型的引入,为 JavaScript 开发者们…...
安装PrettyZoo操作指南
Mac Inter芯片安装PrettyZoo的操作指南 下载安装包 打开浏览器,访问 PrettyZoo的GitHub页面。 在页面中找到适合Mac系统的安装包,通常为prettyZoo-mac.dmg,点击下载。 安装步骤 下载完成后,双击.dmg文件打开安装包。 将Prett…...
西门子200smart之modbus_TCP(做从站与第三方设备)通讯
西门子200smart做MODBUS_TCP从站通讯,只有一个指令。设置相关参数即可完成读写操作。此次,我们使用汇川EASY系列PLC做主站,完成演示。关于汇川案例的演示,详见汇川EASY系列之以太网通讯(MODBUS_TCP做主站)-CSDN博客 关于主站和从站的介绍 A/请求:即主动方 向被动方发…...
微服务 - 中级篇
微服务 - 中级篇 一、微服务架构深化(一)服务拆分原则(二)服务通信方式 二、微服务技术选型(一)开发框架(二)容器技术 三、微服务实践与优化(后续会详细分析)…...
多语言生成语言模型的少样本学习
摘要 大规模生成语言模型,如GPT-3,是极具竞争力的少样本学习模型。尽管这些模型能够共同表示多种语言,但其训练数据以英语为主,这可能限制了它们的跨语言泛化能力。在本研究中,我们在一个涵盖多种语言的语料库上训练了…...
基于Python+Django的旅游管理系统
项目介绍 PythonDjango旅游管理系统 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 - 前台功能包括:首页、景点管理、门票管理、旅游资讯、在线反馈、。 - 后台功能包…...
七桥问题与一笔画问题:图论的奠基石
七桥问题与一笔画问题:图论的奠基石 目录 历史背景问题描述数学模型化欧拉的解决方案欧拉定理及证明一笔画问题现代应用总结 历史背景 18世纪的哥尼斯堡(今俄罗斯加里宁格勒)是一座被普雷格尔河分割的城市,河中有两个岛屿&…...
好吧好吧,看一下达梦的模式与用户的关系
单凭个人感觉,模式在达梦中属于逻辑对象合集,回头再看资料 应该是一个用户可以对应多个模式 问题来了,模式的ID和用户的ID一样吗? 不一样 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…...
Qt开发:QComboBox的使用
文章目录 一、概述二、QComboBox添加数据三、常用函数四、信号与槽函数 一、概述 QComboBox 是 Qt 提供的一个下拉列表控件,它允许用户从预定义的选项中进行选择,同时也支持手动输入自定义内容(如果启用了可编辑模式)。QComboBox…...
Manacher 马拉车算法
Manacher 马拉车算法 5. 最长回文子串 - 力扣(LeetCode) 马拉车算法是目前解决寻找字符串中最长的回文子串时间复杂度最低的算法(线性O(n)). 中心扩散法 初始化一个长度与字符串 s 相等的 臂长数组 arr 和 最长臂长 max 与 最…...
centos7搭建postgresql12主从
主从搭建 192.168.159.101 node1 主库(读写) 192.168.159.102 node2 备库(只读) 两台机器首先安装postgrsql 主库 postgres用户操作: 修改postgresql.conf # 在文件中修改(此配置仅用于远程访问, 流复制后续还有额外…...
VL开源模型实现文本生成图片
一、 基础知识 根据描述生成图片的视觉-语言模型(Vision-Language Models, VL 模型)是近年来多模态生成领域的热点研究方向。这些模型能够根据自然语言描述生成高质量的图像,广泛应用于艺术创作、设计辅助、虚拟场景构建等领域。 1 根据描述…...
动态规划——分组背包问题
动态规划——分组背包问题 分组背包问题分组背包思路分组背包OJ分组背包OJ汇总 分组背包问题 N件物品和一个容量为V的背包。第i件物品的体积是w[i],价值是v[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入…...
Leetcode 3495. Minimum Operations to Make Array Elements Zero
Leetcode 3495. Minimum Operations to Make Array Elements Zero 1. 解题思路2. 代码实现 题目链接:3495. Minimum Operations to Make Array Elements Zero 1. 解题思路 这一题的话核心就是统计对任意自然数 n n n,从 1 1 1到 n n n当中所有的数字对…...
STM32 —— MCU、MPU、ARM、FPGA、DSP
在嵌入式系统中,MCU、MPU、ARM、FPGA和DSP是核心组件,各自在架构、功能和应用场景上有显著差异。以下从专业角度详细解析这些概念: 一、 MCU(Microcontroller Unit,微控制器单元) 核心定义 集成系统芯片&a…...
Linux高级IO
五种IO模型 具象化理解 IO:等 数据拷贝 read/recv: 1、等 - IO事件就绪 - 检测功能成分在里面 2、数据拷贝 问:什么叫做高效的IO? 答:单位时间,等的比重越小,IO的效率越高。 IO模型&am…...
机器人的手眼标定——机器人抓取系统基础系列(五)
机器人的手眼标定——机器人抓取系统基础系列(五) 前言一、机器人标定相关概念1.1 内参标定和外参标定1.2 Eye-in-Hand 和 Eye-to-Hand1.3 ArUco二维码和棋盘格标定区别 二、机器人标定基本原理2.1 机器人抓取系统坐标系2.2 标定原理 三、标定步骤和注意…...
Android 图片加载框架:Picasso vs Glide
引言 在 Android 开发中,图片加载是移动应用的核心功能之一。合理选择图片加载框架不仅能提升用户体验,还能优化内存管理和应用性能。本文将深入对比 Picasso 和 Glide 两大主流框架,结合代码示例分析它们的差异、工作原理及优化策略。 1. …...
uniapp从 vue2 项目迁移到 vue3流程
以下是必须为迁移到 vue3 进行调整的要点,以便 vue2 项目可以在 vue3 上正常运行。 1. 在index.js中创建应用程序实例 // Before - Vue 2 import Vue from vue import App from ./App // with no need for vue3 Vue.config.productionTip false // vue3 is no lon…...
DeepSeek R1 本地部署指南 (2) - macOS 本地部署
上一篇: DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 1.安装 Ollama Ollama https://ollama.com/ 点击 Download - Download for macOS 解压下载 zip 启动程序 3. 选择版本 DeepSeek R1 版本 deepseek-r1 https://ollama.com/library/deepseek-r1 模…...
DeepSeek技术架构解析:MoE混合专家模型
一、前言 2025年初,DeepSeek V3以557万美元的研发成本(仅为GPT-4的1/14)和开源模型第一的排名,在全球AI领域掀起波澜。其核心创新之一——混合专家模型(Mixture of Experts, MoE)的优化设计,不…...
Ubuntu实时读取音乐软件的音频流
文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的,我需要在Ubuntu中,实时读取正在播放音乐的音频流,然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现,好处是可以直接利用Helvum…...
2025年2月-3月后端go开发找工作感悟
整体感悟 目标 找工作首先要有一个目标,这个目标尽可能的明确,比如我要字节、拼多多之类的公司,还是要去百度、滴滴这样的,或者目标是创业公司。但是这个目标是会动态调整的,有可能我们的心态发生了变化,一…...
OpenCV图像拼接(1)自动校准之校准旋转相机的函数calibrateRotatingCamera()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::calibrateRotatingCamera 是OpenCV中用于校准旋转相机的函数。它特别适用于那种相机相对于一个固定的场景进行纯旋转运动的情况&…...
【极速版 -- 大模型入门到进阶】快速了解大型语言模型
文章目录 🌊 大模型作为一种生成式人工智慧,厉害在哪儿?-> 通用能力🌊 LLM 如何生成输出:简而言之就是文字接龙🌊 GPT 之前 ...:模型规模和数据规模概览🌊 ChatGPT 有三个训练阶段…...
MySQL 锁机制详解
MySQL 锁机制详解 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、 RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数…...
牛客网【模板】二维差分(详解)c++
题目链接:【模板】二维差分 1.题目分析 类比一下,因为差分因为差分是在数组里的某一段同时加上一个K二维是在二维数组中选择一个词矩阵,让词矩阵中每一个元素都加上一个K 2.算法原理 解法-:暴力解法 -> 模拟 你告诉我一个左上角和右下…...
从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!
我正在参加Trae「超级体验官」创意实践征文, 本文所使用的 Trae 免费下载链接: www.trae.ai/?utm_source… 前言 大家好,我是小Q,字节跳动近期推出了一款 AI IDE—— Trae,由国人团队开发,并且限时免费体…...
【清华大学】AIGC发展研究(3.0版)
目录 AIGC发展研究报告核心内容一、团队简介二、AI哲学三、国内外大模型四、生成式内容(一)文本生成(二)图像生成(三)音乐生成(四)视频生成 五、各行业应用六、未来展望 AIGC发展研究…...
Kafka--常见问题
1.为什么要使用 Kafka,起到什么作用 Kafka是一个高吞吐量、分布式、基于发布订阅的消息系统,它主要用于处理实时数据流 Kafka 设计上支持高吞吐量的消息传输,每秒可以处理数百万条消息。它能够在处理大量并发请求时,保持低延迟和…...
maptalks图层交互 - 模拟 Tooltip
maptalks图层交互 - 模拟 Tooltip 图层交互-模拟tooltip官方文档 <!DOCTYPE html> <html><meta charsetUTF-8 /><meta nameviewport contentwidthdevice-width, initial-scale1 /><title>图层交互 - 模拟 Tooltip</title><style typet…...
【前端】Visual Studio Code安装配置教程:下载、汉化、常用组件、基本操作
文章目录 一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感谢观看! 一、Visual Studio Code下载 下载官网:https://code.visualstudio.com/ 进入官网后点击右上角的Download &…...
datetime“陷阱”与救赎:扒“时间差值”证道
时间工具陷阱,其实是工具引用的误解。 笔记模板由python脚本于2025-03-23 23:32:58创建,本篇笔记适合时间工具研究的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 Pyth…...
3DMAX曲线生成器插件CurveGenerator使用方法
1. 脚本功能简介 3DMAX曲线生成器插件CurveGenerator是一个用于 3ds Max 的样条线生成工具,用户可以通过简单的UI界面输入参数,快速生成多条样条线。每条样条线的高度值随机生成,且可以自定义以下参数: 顶点数量:每条…...
Apache漏洞再现
CVE-2021-41773路径穿越漏洞 1、开环境 sudo docker pull blueteamsteve/cve-2021-41773:no-cgid sudo docker run -dit -p 8082:80 blueteamsteve/cve-2021-41773:no-cgid 2、访问8082端口 3、打开工具 4、输入网址,检测漏洞...
git,openpnp - 根据安装程序打包名称找到对应的源码版本
文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改,首先就得知道官方打包的安装程序对应的…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(11)
7.3. 查询计划相关操作符 98)Table Scan:该操作符从查询计划参数列确定的表中获取所有数据行。如果其参数列中出现WHERE:()谓词,则只返回满足该谓词的数据行。该操作符为逻辑操作符和物理操作符。该操作符具体如图7.3-98节点1所示。 图 7.3-…...
编译原理——词法分析
文章目录 词法分析:从基础到自动构造一、词法分析程序的设计一、词法分析程序的设计二、PL/0编译程序中词法分析程序的设计与实现1. 语法特定考量2. 通过状态转移表运用有限状态自动机3. 示例代码片段(用于说明的伪代码) 三、单词的形式化描述…...
Linux内核,内存分布
x86_64的物理地址范围为64bit,但是因为地址空间太大目前不可能完全用完,当前支持57bit和48bit两种虚拟地址模式。 地址模式单个空间用户地址空间内核地址空间32位2G0x00000000 - 0x7FFFFFFF0x80000000 - 0xFFFFFFFF64位(48bit)128T0x00000000 00000000 …...
AI鸟类识别技术革新生态监测:快瞳科技如何用“智慧之眼”守护自然?
在生态环境保护日益受关注的今天,“鸟类识别”已从专业科研工具演变为推动生态治理数字化的核心技术。无论是湿地保护区的珍稀候鸟监测,还是城市机场的鸟击风险预警,AI技术的精准赋能正在改写人类与自然的互动方式。作为行业领先的智能解决方…...
c++之set
一、set特性及用途? 唯一性:set 中的元素是唯一的,不会存在重复的元素。自动排序:set 中的元素会自动按照默认的升序规则进行排序。底层实现:set 通常基于红黑树实现,具有自平衡功能,因此插入、…...
【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解
目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek 通义万相制作AI视频流程 4.1 D…...
【操作系统】自旋锁和互斥锁
自旋锁和互斥锁是用于多线程同步的两种常见锁机制,主要区别在于等待锁的方式和适用场景。以下是它们的对比分析: 1. 等待机制 自旋锁(Spinlock)互斥锁(Mutex)线程通过 忙等待(Busy-Wait&#x…...
人工智能在医疗影像诊断中的应用与实践
引言 随着人工智能技术的飞速发展,其在医疗领域的应用逐渐成为研究和实践的热点。特别是在医疗影像诊断方面,人工智能技术凭借其强大的数据处理能力和模式识别能力,为提高诊断效率和准确性带来了新的希望。本文将探讨人工智能在医疗影像诊断中…...
Java中synchronized 和 Lock
1. synchronized 关键字 工作原理 对象锁:在Java中,每个对象都有一个与之关联的监视器锁(monitor lock)。当一个线程尝试进入由 synchronized 保护的代码块或方法时,它必须首先获取该对象的监视器锁。如果锁已经被其…...
【C语言系列】数据在内存中存储
数据在内存中存储 一、整数在内存中的存储二、大小端字节序和字节序判断2.1什么是大小端?2.2练习2.2.1练习12.2.2练习22.2.3练习32.2.4练习42.2.5练习52.2.6练习6 三、浮点数在内存中的存储3.1练习3.2浮点数的存储3.2.1 浮点数存的过程3.2.2 浮点数取的过程 3.3题目…...
qt 对QObject::tr()函数进行重定向
在 Qt 中,QObject::tr() 函数用于国际化(i18n),它用于标记需要翻译的字符串。通常情况下,tr() 函数会从翻译文件(如 .qm 文件)中查找对应的翻译字符串。如果你希望重定向 tr() 函数的行为&#…...
C#基础学习(三)值类型和引用类型:编程世界的“现金“ vs “银行卡“,以及string这个“渣男“的叛变行为
开场白 各位程序猿/媛们,今天我们来聊一聊编程世界里的"金钱观"。 你以为只有人类会纠结现金和存款的区别?不不不,C#中的值类型和引用类型每天都在上演这场大戏! 而我们的string同学,表面是…...
自动驾驶背后的数学:多模态传感器融合的简单建模
上一篇博客自动驾驶背后的数学:特征提取中的线性变换与非线性激活 以单个传感器为例,讲解了特征提取中的线性变换与非线性激活。 这一篇将以多模态传感器融合为例,讲解稍复杂的线性变换和非线性激活应用场景。 (一)权重矩阵的张量积分解 y = W x + b = [ w 11 ⋯ w 1 n ⋮…...
如何设置sudo权限
打开终端:按 Ctrl Alt T 打开终端。 编辑 sudoers 文件: 使用 visudo 命令编辑 /etc/sudoers 文件(visudo 会检查语法,避免错误): sudo visudo 添加用户权限: 在文件中找到以下行࿱…...