什么是symbol
ES6中 引入了一种新的原始数据类型 ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
语法
Symbol([description])
参数
description
可选
可选的,字符串类型。对symbol的描述,可用于调试但不是访问symbol本身。
用法
使用Symbol来作为对象属性名(key)
用于对象属性的定义和访问
const name= Symbol()
const age = Symbol()
let obj = {
[name]: "周杰伦"
}
obj[age ] = 18
obj[name] // 周杰伦'
obj[age ] // 18
注意:Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 sy 属性,而不是 Symbol 值 sy 属性。
使用Symbol来替代常量
const TYPE_AUDIO = Symbol()
const TYPE_VIDEO = Symbol()
const TYPE_IMAGE = Symbol()
function handleFileResource(resource) {
switch(resource.type) {
case TYPE_AUDIO:
playAudio(resource)
break
case TYPE_VIDEO:
playVideo(resource)
break
case TYPE_IMAGE:
previewImage(resource)
break
default:
throw new Error('Unknown type of resource')
}
注意 :Symbol 的值是唯一的,所以不会出现相同值得常量,即可以保证 switch 按照代码预想的方式执行。
特点
1.没有字面量写法
2.新的数据类型返回symbol
3.每次调用symbol函数得到的函数永远不会相等,不管描述的符号是否相同
4.符号可以作为对象的属性名使用,这种属性名叫符号的属性 5.通过设计,让外面无法访问到
6.符号属性不能被枚举
7.符号属性无法被隐士转换,数学运算,字符串拼接都不行 可以进行内部的显式转换 console.log的输出
API
1.Symbol.for()
:共享符号(“符号描述”) 如果符号描述相等,则可以得到同一个符号
特殊含义的共享符号 通过Symbol的配置得到的
JavaScript 松散,写法不严谨
必须去解决这些严谨性的问题
配置底层的实现原理
2.Symbol.hasInstance
:用于判断某对象是否为某构造器的实例。 因此你可以用它自定义instanceof操作符在某个类上的行为。
3.Symbol.isConcatSpreadable
:用于配置某对象作为Array.prototype.concat()方法的参数时是否展开其数组元素
4.Symbol.toPrimitive
:作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。
5.Symbol.toStringTag
:可以影响Object.prototype.toString的返回值