Hashbang Grammar S4
中文标题:Hashbang 语法
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2023
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案通过在 JS 引擎中处理 hashbang(#!)注释的剥离,而不再由 CLI 宿主处理,从而标准化了源文件开头的 hashbang 语法。它仅在 Script 或 Module 目标的开头允许 hashbang,支持 eval 但不支持 Function,并处理了 BOM 的交互。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
Hashbang 语法
本提案旨在匹配某些 CLI JS 宿主中的事实用法,这些宿主允许使用 Shebangs / Hashbang。这些宿主目前会剥离 hashbang,以生成有效的 JS 源文本,然后再传递给 JS 引擎。该提案将剥离操作移至引擎,从而统一并标准化这一过程。
示例
状态
- 阶段:4
- 测试
- 规范 PR
- 已实现并发布的浏览器/环境:
- Chrome 74
- Firefox 67
- ChakraCore
- Safari 13.1
- Node.js 12.0.0
- xs
为什么使用 Hashbang 而不是 Shebang
Hash 通常与现代涉及 # 的术语相关联,如 hashtag。此外,为了便于发现,"hash sign" 用于表示 #,而 "she sign" 则不常用。
为什么只在源文本开头允许
对于各种 CLI 环境中的解释器,Hashbang 注释仅在文件开头有效。在其他位置允许它并不会带来预期用途上的好处,实际上可能导致混淆,因为 CLI 环境不会识别。此外,在其他位置允许 Hashbang 会与 #! 作为某种中缀二元运算符的语法空间重叠。如果需要在其他位置添加行注释,请使用 //。
hashbang 语法是否适用于 eval / Function?
Hashbang 注释仅在 Script 或 Module 解析目标的开头可用。由于 eval 使用 Script,它确实支持 Hashbang 注释。由于 Function 使用 FunctionBody,它不支持。
与字节顺序标记的交互
源文本开头的 字节顺序标记(BOM)字符会阻止后续的 #! 被解释为 hashbang。但是,Web 浏览器在获取外部 脚本 或 模块 时会剥离此字符(分别在 decode 或 UTF-8 decode 中),这发生在文本被解释为 ECMAScript 之前。因此,在浏览器中,外部脚本或模块(而非内联脚本)中 #! 之前可以存在 BOM 字符。
一般来说,BOM 字符假定由宿主处理,本提案不给予特殊对待。