Symbol

什么是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的返回值


版权声明:本文为zyf_1998原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。