讲师中心 微信公众号
AI工具推荐 视频效率加速

ES6 Proxy 实现可迭代的自引用数组

落磊小哥_5979

落磊小哥_5979

发布时间:2026-01-30 11:07:02

|

805人浏览过

|

来源于php中文网

原创

ES6 Proxy 实现可迭代的自引用数组

本文介绍如何使用 es6 proxy 创建一个始终返回自身且支持 for...of 迭代的代理数组,关键在于正确拦截 symbol.iterator 等符号属性,确保代理对象满足可迭代协议。

在 JavaScript 中,for...of 循环依赖对象是否实现了可迭代协议(iterable protocol),即对象必须拥有 Symbol.iterator 方法并返回一个迭代器(iterator)。当对 Proxy 对象执行 for (let v of p) 时,引擎会尝试读取 p[Symbol.iterator] —— 这是一个 Symbol 类型的 key,而你的原始代码中仅显式处理了 'length' 和 'push' 字符串属性,却忽略了所有 symbol 属性(包括 Symbol.iterator),导致返回值为 p(即代理本身),而非一个合法的迭代器函数,最终抛出 TypeError: p is not iterable。

要解决该问题,核心是:在 get 拦截器中放行所有 symbol 类型的属性访问,让底层数组的原生行为(如 Array.prototype[Symbol.iterator])正常生效。同时,为保证代理数组首次访问即包含自身,应在 get 中优先完成初始化(obj.push(p)),而非操作 p.push(p)(后者可能引发无限递归或代理状态混乱)。

以下是完整、健壮的实现:

Bailian Usage Proxy
Bailian Usage Proxy

阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。

下载
const p = new Proxy([], {
  get(obj, prop) {
    // 首次访问任意属性时,向底层数组推入自身(确保 self-reference)
    if (obj.length === 0) {
      obj.push(p);
    }
    // 放行 length、所有 symbol 属性(含 Symbol.iterator)、以及常用数组方法
    if (prop === 'length' || typeof prop === 'symbol' || 
        ['push', 'pop', 'shift', 'unshift', 'forEach', 'map', 'filter', 'reduce', 'slice', 'concat'].includes(prop)) {
      return obj[prop];
    }
    // 其他属性访问均返回代理自身(实现链式自引用)
    return p;
  }
});

✅ 此实现在以下场景均能正确工作:

  • for (let v of p) { console.log(v); } → 输出 [Proxy](即 p 自身);
  • p.any.any.any → 无限链式代理,每一层都是同一 p;
  • p.map(x => x)、p.forEach(console.log) → 基于原生数组方法正常执行;
  • p.length → 返回 1;
  • Array.isArray(p) → 返回 true(Proxy 不改变目标对象类型)。

⚠️ 注意事项:

  • 不要使用 p.push(...) 初始化,应操作 obj.push(...),避免触发代理自身的 get 逻辑造成循环;
  • 若需严格模拟“只读”或“不可扩展”行为,可配合 set、defineProperty、preventExtensions 等拦截器进一步约束;
  • 生产环境慎用深度自引用结构,可能影响调试、序列化(如 JSON.stringify(p) 会报错)及内存回收。

通过精准控制 symbol 属性的透传,你就能让 Proxy 同时满足数组语义与可迭代协议——这是构建高级数据映射、Mock 工具或领域特定语法糖的关键基础能力。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2215

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3502

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1176

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4039

2025.09.10

es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

285

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

406

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

395

2025.12.24

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

798

2025.12.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn