判断属性值是否为 symbol 类型应使用 typeof obj.prop === 'symbol';若判断属性名是否为 symbol,则需用 object.getownpropertysymbols(obj) 获取并比对。

直接用 typeof 判断属性值即可,不是判断属性名本身是否为 Symbol —— 因为属性名可以是字符串或 Symbol,而“是否为 Symbol 类型”指的是该属性对应的 值 的类型。
先确认你真正想判断什么
常见混淆点:有人以为“Symbol 类型的属性”是指 key 是 Symbol,其实 JS 中没有“Symbol 类型的属性”这种说法。准确说有两类情况:
- 属性的 key 是 Symbol(如
obj[Symbol('id')] = 123)—— 这时 key 是 Symbol,但值可以是任意类型 - 属性的 值是 Symbol(如
obj.token = Symbol('auth'))—— 这才是“该属性的值是否为 Symbol 类型”
判断某个属性的值是不是 Symbol
对属性值使用 typeof:
-
typeof obj.prop === 'symbol'✅ 推荐,简洁、可靠、无兼容性问题 -
Object.prototype.toString.call(obj.prop) === '[object Symbol]'⚠️ 可用但冗长,仅在需要统一多类型检测逻辑时考虑 -
obj.prop instanceof Symbol❌ 不成立,Symbol 是原始类型,不能用 instanceof
示例:
const sym = Symbol('test');
const obj = { a: 42, b: sym, c: 'hello' };
console.log(typeof obj.a); // 'number'
console.log(typeof obj.b); // 'symbol' ← 判断成功
console.log(typeof obj.c); // 'string'
如果你想检查某个 key 是否为 Symbol(即属性名是 Symbol)
这属于遍历对象自身 Symbol 属性的场景,需用:
-
Object.getOwnPropertySymbols(obj)获取所有 Symbol 类型的 key 数组 - 再用
includes()或循环比对
示例:
const s1 = Symbol('x');
const s2 = Symbol('y');
const obj = { [s1]: 'val1', normal: 'ok', [s2]: 42 };
const symbolKeys = Object.getOwnPropertySymbols(obj); // [s1, s2]
console.log(symbolKeys.includes(s1)); // true
console.log(symbolKeys.includes(Symbol('x'))); // false ← 描述相同也不相等
实际开发中容易踩的坑
- Symbol 值不能隐式转字符串:
'' + obj.b或alert(obj.b)会报错,必须显式调用obj.b.toString() - Symbol 属性不会出现在
for...in、Object.keys()、JSON.stringify()中,但可通过Object.getOwnPropertySymbols()拿到 - 相同描述的 Symbol 不相等:
Symbol('a') === Symbol('a')是false,跨模块复用要用Symbol.for()











