
ESLint no-iterator 规则详解禁用已废弃的__iterator__属性【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint本文是 ESLint 核心规则系列之一聚焦no-iterator规则它用于禁止使用 JavaScript 历史上 SpiderMonkey 引擎私有的__iterator__属性引导开发者改用 ECMAScript 6 标准的迭代器Iterator与生成器Generator语法。读完本文你将理解该规则的设计动机、AST 层面的检测原理、错误与正确写法边界、测试覆盖范围并掌握在当前仓库中查看、运行与测试这一规则的具体方法。规则背景__iterator__是什么__iterator__是 SpiderMonkeyFirefox 的 JavaScript 引擎对 JavaScript 的非标准扩展属性它允许开发者为对象定义自定义迭代器使对象可以与for...in、for each等传统构造兼容。在 ES6 标准化之前这是实现“可迭代对象”的一种民间方案典型写法如下Foo.prototype.__iterator__ function() { return new FooIterator(this); }该属性如今已经废弃obsolete不应再使用。标准化的替代方案是 ECMAScript 6 引入的迭代器协议与生成器function* fooIterator() { // yield 依次产出值 yield 1; yield 2; }no-iterator规则存在的目的正是防止代码中出现__iterator__这一历史遗留写法——它并未在多数浏览器中实现使用它会引入兼容性隐患。Rule Details规则检测范围本规则针对防止因使用__iterator__属性而引发的错误该属性未在多个浏览器中实现因此只要在代码中遇到__iterator__属性规则就会发出警告。从规则元数据lib/rules/no-iterator.js可以看到type: suggestion属于“建议类”规则表示它提供改进建议而非严格错误检测recommended: false未包含在 ESLint 的推荐配置集中需要用户显式启用schema: []规则没有任何可配置选项messageId: noIterator错误消息文案为Reserved name __iterator__.“保留名称__iterator__”。错误代码示例以下代码都会触发no-iterator报告/*eslint no-iterator: error*/ Foo.prototype.__iterator__ function() { return new FooIterator(this); }; foo.__iterator__ function () {}; foo[__iterator__] function () {};三个示例分别覆盖了三种常见触发形态原型链上赋值Foo.prototype.__iterator__ ...点号访问赋值foo.__iterator__ ...方括号字符串访问赋值foo[__iterator__] ...。正确代码示例以下代码不会触发规则/*eslint no-iterator: error*/ const __iterator__ foo; // 这里只是把变量命名为 __iterator__并未使用该属性注意规则只针对属性访问MemberExpression场景。把__iterator__用作普通变量名是合法的不会被报告——它并不是被访问的属性。源码实现AST 层面的检测原理规则的检测逻辑非常精简完整实现位于 lib/rules/no-iterator.jscreate(context) { return { MemberExpression(node) { if (getStaticPropertyName(node) __iterator__) { context.report({ node, messageId: noIterator, }); } }, }; }其工作原理可以拆解为三步监听MemberExpression节点规则只对“成员访问表达式”如a.b、a[b]感兴趣这是属性访问在 AST 中的对应节点类型求取静态属性名调用工具函数getStaticPropertyName(node)获取被访问的属性名精确匹配当属性名恰好等于__iterator__时以noIterator消息 ID 上报问题。getStaticPropertyName 如何求取属性名getStaticPropertyName是规则共享工具 lib/rules/utils/ast-utils.js 提供的通用工具函数它对MemberExpression节点取node.property作为属性节点然后分两种情况求名当property是Identifier标识符且非计算属性!node.computed时直接返回其name例如foo.__iterator__得到__iterator__其他情况交给getStaticStringValue(prop)求静态字符串值对于字符串字面量__iterator__、__iterator__以及不含表达式的简单模板字面量__iterator__都能静态解析出__iterator__。正是借助这一工具规则无需自行处理点号、方括号、模板字符串等多种写法差异统一收敛为字符串比较。若属性名是动态的如foo[someVar]getStaticPropertyName返回null规则自然不会误报。Options无配置项本规则没有可配置选项schema: []因此配置时只需要指定严重级别{ rules: { no-iterator: error } }在扁平化配置flat config中写法如下export default [ { rules: { no-iterator: error } } ];由于规则未包含在eslint:recommended中也不属于任何核心配置集开发者需要根据自身项目的历史代码情况显式开启或关闭。对于仍维护旧代码库、存在__iterator__残留用法的项目建议开启该规则以逐步清理。测试验证规则边界的行为确认规则的测试文件位于 tests/lib/rules/no-iterator.js使用RuleTester驱动完整覆盖了“什么该报、什么不该报”的边界。合法valid用例包括var a test[__iterator__];—— 方括号内是未加引号的变量属于动态访问不会被报告var __iterator__ null;—— 将__iterator__用作变量名合法foo[__iterator] null;—— 模板字符串内容是__iterator少两个下划线不匹配foo[__iterator__\n] null;—— 模板字符串带换行符静态求值结果不等于__iterator__不匹配。非法invalid用例包括var a test.__iterator__;—— 点号访问Foo.prototype.__iterator__ function() {};—— 原型赋值var a test[__iterator__];—— 单引号字符串访问var a test[__iterator__];—— 模板字符串访问需要ecmaVersion: 6test[__iterator__] function () {};—— 模板字符串访问并赋值。从测试可以看出规则的判定非常“字面化”只匹配静态可解析且完全等于__iterator__的属性访问。类似的易混淆写法如__iterator、带换行的模板串都会被放过这也是该规则“精准防误报”的设计取向。如何启用与验证no-iterator已被注册为 ESLint 核心规则注册入口在 lib/rules/index.jsno-iterator: () require(./no-iterator)随 ESLint 一并分发无需安装额外插件。在仓库中快速验证规则行为可以直接运行其测试套件node tests/lib/rules/no-iterator.js或通过 npm 脚本运行针对该规则的单测测试文件内部使用RuleTester会直接输出 pass/fail 汇总。开启规则后用下面的示例即可复现报告/*eslint no-iterator: error*/ var obj {}; obj.__iterator__ function () {}; // error: Reserved name __iterator__.延伸阅读迭代器与生成器规范ECMAScript 6 的 Iterators and Generators 指南对应原文档 further_reading 中的 MDN 迭代器与生成器文档主题__iterator__兼容性资料非标准特性兼容性表compat-table 中__iterator__条目说明其在各引擎的实现情况废弃特性说明MDN Deprecated and obsolete features 中关于 Object 方法的部分列出了__iterator__等一批已废弃的 JavaScript 特性。若需了解与迭代器相关的其他核心规则可在 docs/src/rules 目录中检索相关主题规则源码与测试则分别位于 lib/rules/no-iterator.js 与 tests/lib/rules/no-iterator.js。【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考