<h1>是 JavaScript 私有字段的语法强制标识,提供编译时硬边界访问控制;下划线仅为命名约定,无语言级约束,且 # 避免兼容性问题并简化命名。</h1>

带 # 是语法强制要求,不是风格偏好——它标志着这个字段受语言级访问控制保护,不是靠命名约定“提醒”别人别碰。
它是编译时的硬边界,不是运行时的软提示
JavaScript 引擎在解析类代码时,就识别 # 开头的标识符为私有成员。任何外部访问(比如 obj.#field、this['#field']、Reflect.get(obj, '#field'))都会直接报 SyntaxError 或 TypeError,连执行都进不去。下划线(_field)只是开发者间的默契,代码里写 obj._field = null 完全合法,引擎不管。
# 让意图和约束同时可见
- 看到
#token,立刻知道:这东西不能被子类读、不能被 JSON 序列化、不能被 for…in 枚举、测试时也不该去 mock 它 - 看到
_cache,得查文档或上下文才能确认:这是真私有?还是只是暂时不想暴露?能不能在子类里用? - TypeScript 能基于 # 做准确类型检查;而 _ 开头的字段,在类型系统里和普通字段完全一样
避免和已有代码冲突,兼顾向后兼容
下划线是合法的变量名前缀,大量旧库(如 lodash、underscore)重度依赖 _ 命名。如果规范把 _xxx 定义为“自动私有”,会直接破坏百万级项目。# 符号在 JS 历史上从未作为标识符字符使用,引入它不会导致任何现有代码失效。
命名本身要直白,不加冗余前缀
# 后面的名字不需要再加 private、internal 或 __:
- ✅
#userId、#retryCount、#isConnected - ❌
#privateUserId、#_userId、#__userId
因为 # 本身已承担“私有”语义,重复表达反而模糊重点。名字应聚焦描述数据本质,而不是它的访问权限。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/126976.html