js的ES6语法Symbol

96 阅读2分钟

Symbol

假如一个柜子里面有很多电脑,我们想要精准的找的你需要的那台,需要型号,颜色,尺寸等多个信息来锁定他,在计算机中也是一样,如果有重名的字符串会进行覆盖掉,我们可能加上前缀或者编号来区分,而Symbol的值是唯一的,独一无二的不会重复的。Symbol完美的解决了这个问题。

image.png

基础知识

let hd = Symbol();
//Symbol 不可以添加属性
hd.name = "后盾人";
console.log(hd.name);//undefined
//可传入字符串用于描述Symbol,方便在控制台分辨Symbol
let edu = Symbol("这是一个测试");
//使用description可以获取传入的描述参数
console.log(edu.description); //后盾人

Symbol.for和Symbol.keyFor

根据描述获取Symbol,如果不存在则新建一个Symbol

Symbol.keyFor 根据使用Symbol.for登记的Symbol返回描述,如果找不到返回undefined 。

  • 使用Symbol.for会在系统中将Symbol登记
  • 使用Symbol则不会登记
let hd = Symbol.for("你好");
let hds = Symbol.for("你好");
console.log(hd === hds); //true
console.log(Symbol.keyFor(hd)); //你好

对象属性

Symbol 是可以保证对象属性的唯一性。

  • Symbol 声明和访问使用 [](变量)形式操作
  • 也不能使用 . 语法因为 .语法是操作字符串属性的。

下面写法是错误的,会将symbol 当成字符串symbol处理

let symbol = Symbol("后盾人");
let obj = {
  symbol: "hdcms.com"
};
console.log(obj);

正确写法是以[] 变量形式声明和访问

let symbol = Symbol("后盾人");
let symbols = Symbol("后盾人");
let obj = {
  [symbol]: 1,
  symbol: 1,
  [symbols]: 2,
};
console.log(obj);
//{ symbol: 1, [Symbol(后盾人)]: 1, [Symbol(后盾人)]: 2 }

遍历属性

Symbol 不能使用 for/infor/of 遍历操作,可以使用 Object.getOwnPropertySymbols 获取所有Symbol属性

for (const key of Object.getOwnPropertySymbols(obj)) {
  console.log(key);
}

也可以使用 Reflect.ownKeys(obj) 获取所有属性包括Symbol

for (const key of Reflect.ownKeys(obj)) {
  console.log(key);
}

如果对象属性不想被遍历,可以使用Symbol保护

const site = Symbol("网站名称");
class User {
  constructor(name) {
    this[site] = "后盾人";
    this.name = name;
  }
  getName() {
    return `${this[site]}-${this.name}`;
  }
}
const hd = new User("大叔");
console.log(hd.getName());//后盾人-大叔
for (const key in hd) {
  console.log(key);//name
}