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(),
}