symbol 是 javaScript 第七种原始类型,es6 引入,核心特性为独一无二且不可覆盖;用 Symbol() 生成,描述仅用于调试;不能隐式转字符串;作为对象属性名可避免冲突,不被 Object.keys 等枚举;支持内置知名符号定制行为;适合替代魔术字符串作安全常量。

Symbol 是 javascript 中第七种原始数据类型,ES6 引入,核心就两点:**独一无二、不可被覆盖**。
它不是字符串,但长得像
Symbol 值由 Symbol() 函数生成,不能用 new 调用:
-
const s1 = Symbol('id')和const s2 = Symbol('id')不相等 —— 即使描述一样,也各自独立 - 描述(description)只用于调试显示,比如
console.log(s1)输出Symbol(id),不影响值本身 - 不能隐式转成字符串:
'' + Symbol('a')会报错;必须显式调用.toString()或String(sym)
它最实用的特性是“不冲突”
作为对象属性名时,Symbol 键天然隔离,不会和字符串键打架:
-
const userId = Symbol('userId');user[userId] = 'U123';user.userId = 'oops';—— 这两行互不影响 -
Object.keys(user)、for...in、jsON.stringify()都看不到 Symbol 键,相当于“隐形但可访问” - 想查它?得用
Object.getOwnPropertySymbols(user)
它能干很多“底层活”
JavaScript 内置了一批以 Symbol.xxx 开头的知名符号(well-known symbols),用来定制对象行为:
YXPHP6.0 豪华版
0
YXPHP6系统可以看做是一个模版平台,而且它又能独立工作. 而且YXPHP6系统也不需要数据库支持. 你可以开发自己的模板,也可以同步官方的模板后进行自己的二次开发,前提是您对YXPHP6要有一定的了解.YXPHP6不仅可以用作企业建站,甚至是blog,只要是您能想到的,YXPHP6几乎都可以胜任. 因为YXPHP6系统本身与模板之间可以说是独立运行的.也就是说,不管你做什么样的网站或者是应用,
0 立即学习“Java免费学习笔记(深入)”;
-
Symbol.iterator:让对象支持for...of循环 -
Symbol.toStringTag:改写Object.prototype.toString.call(obj)的输出 -
Symbol.toPrimitive:控制+obj或obj == 123这类转换逻辑 -
Symbol.hasInstance:自定义obj instanceof MyClass的判断方式
它还能当安全常量用
替代“魔术字符串”,避免拼写错误或意外相等:
-
const STATUS_OK = Symbol('ok');const STATUS_ERR = Symbol('Error'); - 在
switch或状态判断中用它们,语义清晰、值绝对唯一、不怕同名字符串干扰 - 比字符串更可靠,又比私有字段(
#field)兼容性更好
基本上就这些。Symbol 不复杂,但容易忽略——它不是为“完全隐藏”设计的,而是为“不撞车、不误判、可定制”服务的。