ES6学习笔记--Symbol

152 阅读2分钟

1. Symbol

Symbol 是一种新的原始数据类型,前六总是,undefined, nulll Boolean, string, Number, Object

Symbol的值是通过Symbol函数生成的。

Symbol() 不能使用 new 关键字,因为Symbol是一个原始类型的值,不是对象,

如果Symbol()的参数是对象的话,就会调用该对象的toString方法,将其转为字符串,然后生成一个Symbol值。

const obj = {
  toString() {
    return 'avc'
  }
}

const sym = Symbol(obj)
sym //Symbol(avc)

Symbol() 参数可以是 字符串或对象,表示对Symbol实例的描述,相同参数的Symbol函数的返回值是不想等的。

let s1 = Symbol();
let s2 = Symbol();

console.log(s1 === s2) // false
let s1 = Symbol('foo');
let s2 = Symbol('foo');

console.log(s1 === s2) // false

Symbol 不能与其它类型的值进行计算

2. Symbol.prototype.description

ES2019 提供了示例属性description,返回Symbol 的描述

3.作为属性名称的Symbol。

注意一点的是,在使用Symbol值定义属性时,Symbol值必须放在方框号之中。

// 写法一
let sy = Symbol()
a[sy] = 'hello'

// 写法二
let bSymbol = Symbol()
let b = {
  [bSymbol]: 'hello'
}

// 写法三
Object.defineProperty(a, sy,{ value: "hello" });
console.log(a[sy]) // hello

4.Symbol类型可以用于定义一组常量,保证这组常量值都是不想等的。

const log = {}

log.level = {
  debug: Symbol('debug'),
  info: Symbol('info'),
  warn: Symbol('warn'),
}

console.log(log.level.debug)

案例: 消除魔术字符串

function getArea(shape, options) {
  let area = 0;

  switch (shape) {
    case 'Triganle': // 魔术字符串
      area = 0.5 * options.width * options.height
  }
  // ...more code

  return area
}

getArea('Trangle', {width, height: 100})

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

常用的消除魔术字符串的方法就是把他变成一个常量。

const shapeType = {
  triangle: "Triangle",
}

function getArea(shape, options) {
  let area = 0;

  switch (shape) {
    case shapeType.triangle: // 魔术字符串
      area = 0.5 * options.width * options.height
  }
  // ...more code

  return area
}

getArea('Trangle', {width, height: 100})

仔细分析,发现 shapeType.triangle 等于哪个值并不重要,只要确保不会跟其它的 shapeType 属性的值冲突即可,所以适合改用Symbol值

const shapeType = {
  triangle: Symbol(),
}