告别代码冲突!JavaScript Symbol让你写出更健壮、更灵活的代码!

125 阅读1分钟

一、什么是Symbol?

在JavaScript中,Symbol是ES6引入的一种原始数据类型,用于生成全局唯一的标识符。它的核心特性是不可变性和唯一性,即使两个Symbol拥有相同的描述(description),它们的值也永远不会相等​(Symbol('foo') !== Symbol('foo')

Symbol本质上是一个函数,调用它会返回一个Symbol类型的值。你可以选择性地给Symbol添加一个描述,方便调试和识别。

const sym1 = Symbol();
const sym2 = Symbol("这是一个描述");

console.log(sym1); // Symbol()
console.log(sym2); // Symbol(这是一个描述)

console.log(sym1 === sym2); // false

二、Symbol的三大核心特性

  1. 唯一性
    每个Symbol都是独一无二的,适合作为对象的“隐藏”属性键。

    const key1 = Symbol('id');  
    const key2 = Symbol('id');  
    console.log(key1 === key2); // false  
    
  2. 不可枚举性
    Symbol属性默认不会出现在for...inObject.keys()JSON.stringify()中。

    const obj = { [Symbol('secret')]: 'value' };  
    console.log(Object.keys(obj)); // []  
    // 需通过Object.getOwnPropertySymbols()访问  
    console.log(Object.getOwnPropertySymbols(obj).length); // 1 
    
  3. 全局共享Symbol
    使用Symbol.for(key)可在全局注册表中创建或获取Symbol。相同key的Symbol会复用,适合跨模块共享。

    const s1 = Symbol.for('global');  
    const s2 = Symbol.for('global');  
    console.log(s1 === s2); // true  
    console.log(Symbol.keyFor(s1)); // 'global'