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

标识符Symbol和迭代器的实现

  1. Symbol基础

    • Symbol("描述") 创建唯一标识符(每次调用返回新值)
  • Symbol.for("key") 全局注册表模式(相同key返回同一Symbol)
  1. Symbol特性

    • 作为对象属性键时:obj[SymbolKey] = value
    • 不参与常规遍历(不会出现在Object.keys()中)
    • 用于创建私有属性(外部无法通过.访问)
  2. 迭代器实现

    [Symbol.iterator]() {let index = -1;const list = Object.values(this);return {next() {index++;return {done: index === list.length,value: list[index]};}};
    }
    
    • 使对象支持for...of遍历
    • 通过Object.values()获取属性值数组
    • done控制迭代终止条件
  3. 对象扩展

    • 原生对象默认不可迭代(需手动添加迭代器)
    • for...of本质调用对象的[Symbol.iterator]()方法
  4. 代码示例

    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title>
    </head><body><script>//  Symbol 唯一标识符,打标记,不是用来存值// 它是值类型// Symbol,number,string,boolean,undefined,null//   var a = null;//   console.log(typeof a); //object ,历史遗留问题console.log(typeof Symbol()); //symbolvar s1 = Symbol("描述");console.log(s1) //Symbol(描述)var s2 = Symbol("描述");console.log(s1 == s2); //falsevar s3 = Symbol("age");const person = {id: 1001,name: "吴彦祖",gender: "女",[s3]: 20,};console.log(person.age); //undefinedconsole.log(person[s3]); //20// 使用ES6的Symbol.for方法在全局符号注册表中创建或获取一个共享的Symbol值var s1 = Symbol.for("age"); //1.创建var s2 = Symbol.for("age"); //2.读取缓存console.log(s1 == s2); //trueconst persona = {id: 1001,name: "吴彦祖",gender: "女",[Symbol.for("age")]: 20,};//  直接取,拿不到console.log(persona.age);//undefined//  遍历也拿不到for (let k of Object.keys(persona)) {console.log(k);}//  取console.log(persona[Symbol.for("age")]); //20//迭代器const personA = {id: 1001,name: "吴彦祖",gender: "女",[Symbol.iterator]() {let list = Object.values(this); //获取当前对象所有属性 [id,name,gender]let index = -1;return {next() {index++;return {done: index == list.length, //false无限循环,遇到true就结束循环value: list[index],};},};},};console.log("------自己给对象添加迭代器--------");//对象为啥不能被for.of遍历,答案是对象默认情况下没有迭代器(iterable)for (const k of personA) {console.log(k);}</script>
    </body></html>
    
http://www.lryc.cn/news/2402014.html

相关文章:

  • Appium+python自动化(九)- 定位元素工具
  • Unity 中实现可翻页的 PageView
  • clickhouse常用语句汇总——持续更新中
  • 云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】
  • LuaJIT2.1 和 Lua5.4.8 性能对比
  • 深度学习姿态估计实战:基于ONNX Runtime的YOLOv8 Pose部署全解析
  • 深度探索:如何用DeepSeek重构你的工作流
  • 深入解析与解决方案:处理Elasticsearch中all found copies are either stale or corrupt未分配分片问题
  • 【NLP 78、手搓Transformer模型结构】
  • yum更换阿里云的镜像源
  • 如何自定义WordPress主题(5个分步教程)
  • ios版本的Tiktok二次安装不上,提示:Unable to Install “TikTok”
  • react实现markdown文件预览
  • Neo4j 认证与授权:原理、技术与最佳实践深度解析
  • Android Studio 配置之gitignore
  • PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小
  • Perl One-liner 数据处理——基础语法篇【匠心】
  • PHP 打印扩展开发:从易联云到小鹅通的多驱动集成实践
  • rust或tauri项目执行命令的时候,cmd窗口也会弹出显示解决方法
  • [软件工程] 文档 | 技术文档撰写全流程指南
  • 使用Python进行函数作画
  • Python应用continue关键字初解
  • 微型导轨在手术机器人领域中有哪些关键操作?
  • FPGA 的硬件结构
  • EasyRTC音视频实时通话助力新一代WebP2P视频物联网应用解决方案
  • QT开发技术【ffmpeg + QAudioOutput】音乐播放器 完善
  • vscode 离线安装第三方库跳转库
  • DevExpress WinForms v24.2 - 新增日程组件、电子表格组件功能扩展
  • 基于机器学习的心脏病预测模型构建与可解释性分析
  • VisDrone无人机视觉挑战赛观察解析2025.6.5