Symbol 类型

227 阅读2分钟

总结

  1. Symbol 是一个基础数据类型,表示独一无二的值,可以用于消除魔术字符串。
  2. Symbol 的创建不用new操作符,直接用 Symbol(val)。
  3. Symbol 可以作对象属性,该属性是唯一的,Symbol 作为对象属性名时,不能用点运算符。
  4. 获取对象中的 Symbol 属性,可以用 Object.getOwnPropertySymbols 或 Reflect.ownKeys。
  5. 常用方法 Symbol.for: 搜索 Symbol Symbol.keyFor: 获取 Symbol 的 key

独一无二的值

let id1 = Symbol('id');
let id2 = Symbol('id');
console.log(id1 == id2);  //false

作用:消除魔术字符串(魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。)

var shapeType = {
  triangle: 'Triangle'
};
function getArea(shape, options) {
  var area = 0;
  switch (shape) {
    case shapeType.triangle:
      area = .5 * options.width * options.height;
      break;
  }
  return area;
}
getArea(shapeType.triangle, { width: 100, height: 100 });

改为:

const shapeType = {
  triangle: Symbol()
};

triangle 需确保与其他值不发生冲突。

不能使用 new 命令

是一种类似于字符串的数据类型,可以接收一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

Symbol 字符串

对象属性值两种类型

  • 一种是原本就有的字符串,另一种是新增的 Symbol 类型;
  • 凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

Symbol 作为对象属性名时,不能用点运算符

在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号里。For..in,object.keys() 不能访问。

let id = Symbol("mytestid");
let obj = {
  [id]:'symbol'
};
for(let option in obj){
  console.log(obj[option]); //空
}

对象中 symbol 属性的获取方法

  1. Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名。Object.getOwnPropertySymbols 方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。

  2. Reflect.ownKeys 方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

let id = Symbol("mytestid");
let obj = {
	[id]:'symbol'
};
let array = Object.getOwnPropertySymbols(obj);
console.log(array); //[Symbol(id)]
console.log(obj[array[0]]);  //'symbol'

Symbol.for Symbol.keyFor

Symbol.for:它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。

Symbol.keyFor:返回一个已登记的 Symbol 类型值的key。

let name1 = Symbol.for('name'); //检测到未创建后新建
let name2 = Symbol.for('name'); //检测到已创建后返回
console.log(name1 === name2); // true

let name1 = Symbol.for('name');
let name2 = Symbol.for('name');
console.log(Symbol.keyFor(name1));  // 'name'
console.log(Symbol.keyFor(name2)); // 'name'