Symbol() 是在 ES6 中提出来的一个新的基础类型,它主要用来定义一个唯一的属性值,防止重复命名,再对象中有着重要的作用,请耐心看完,最下边有 Symbol 进阶,对初学者来说不太友好,若想深入学习js,请务必耐心看完。

一. 基本用法

Symbol() 中接受一个参数作为符号描述,即使描述相同,他俩本身也不会相同。

let symbol = Symbol()

console.log(typeof symbol) // symbol 类型

let symbolA = Symbol('foo')

let symbolB = Symbol('foo')

console.log('symbolA:' , symbolA, 'symbolB:',symbolB) // symbolA: Symbol(foo) symbolB: Symbol(foo)

console.log('symbolA == symbolB',symbolA == symbolB) // symbolA == symbolB false

二. 全局注册 Symbol.for()

同 Symbol() 一样接受一个参数作为符号描述,不同的是, Symbol.for() 在注册前会查询全局注册表中是否存在该描述,不存在则创建,存在则返回该描述。

let symbolC = Symbol.for('石头山')

let _symbolC = Symbol.for('石头山')

console.log(symbolC === _symbolC) // true

const text = Symbol.keyFor(symbolC) // 访问全局注册表,返回对应的键值

console.log(text) // 石头山

三. 实际使用

大多用在对象中定义唯一键值,防止定义重名键值发生冲突。

1. 直接定义

let name = Symbol('author')

const obj = { }

obj[name] = '石头山'

2. 使用 Object.defineProperty()

Object.defineProperty(obj,name,{

value:'石头山'

})

最终都是给 obj 对象中添加了 唯一键值及其对应值 { Symbol(author):'石头山'}

四. Symbol 进阶篇

   Symbol键值 方法

Symbol.hasInstance

instanceof

Symbol.isConcatSpreadable

Array.concat()

Symbol.match

String.match()

Symbol.replace

String.replace()

Symbol.search

String.search()

Symbol.specie

---

Symbol.split

String.split()

Symbol.toPrimitive

---

Symbol.toStringTag

Object.toString()

Symbol.unscopables

---

看到这里对于刚刚入门的小伙伴来说一定很懵圈,Symbol 常用来定义一些 Object 或者 Function 中的重要方法,我们可以通过 Symbol键值来重写对应的方法,我来给大家重写几个常用的方法,请耐心看完

1. 重写 instanceof

这个方法大家应该都不陌生,用来判断某个实例是否属于某种类型,一下为演示,fA 为 fun 实例,必然打印 ture,由于我们重写,始终返回 false

class fun{

static [Symbol.hasInstance](){

return false

}

}

let fA = new fun()

console.log(fA instanceof fun)  // false

2. 重写  String.replace()

该方法返回一个由替换值,替换部分或所有的模式匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,重写后始终返回 石头山

let name_S = ' my name is '

console.log('重写前',name_S.replace(/name/,'Jock')) // my  Jock is

RegExp.prototype[Symbol.replace] = function (){

return '石头山'

}

console.log('重写后',name_S.replace(/name/,'shikai')) // 石头山

注:不要在全局中重写,可能造成意想不到的后果,在需要的具体对象或方法中重写即可,有兴趣的小伙伴可以自行测试其他方法。

Symbol 进阶底层详解(看这一篇就够了)相关推荐

  1. 代理后台中间件_Golang Gin 实战(十三)| 中间件详解看这一篇就够了

    6000字大章带你死磕Golang Gin中间件 在Gin的整个实现中,中间件可谓是Gin的精髓.一个个中间件组成一条中间件链,对HTTP Request请求进行拦截处理,实现了代码的解耦和分离,并且 ...

  2. Java socket详解,看这一篇就够了

    刚给大家讲解Java socket通信后,好多童鞋私信我,有好多地方不理解,看不明白.特抽时间整理一下,详细讲述Java socket通信原理和实现案例.整个过程楼主都是通过先简单明了的示例让大家了解 ...

  3. strstr函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

    strstr()函数用于:查找子字符串 目录 函数介绍 用法示例 函数讲解 实现函数 事例展示 函数介绍 函数声明:char *strstr(const char *str1, const char ...

  4. strtok函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用)

    strtok()函数用于: 将字符串拆分为标记 函数介绍 函数声明:char * strtok ( char * str, const char * delimiters ); 头  文  件:#in ...

  5. memmove函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

    memmove()函数用于:移动内存块 函数介绍 函数声明:void * memmove ( void * destination, const void * source, size_t num ) ...

  6. strncpy函数详解看这一篇就够了-C语言(函数实现、使用用法举例、与strcpy的区别)

    首先要明确strncpy的功能是:拷贝src字符串的前n个字符至dest 目录 函数介绍 与strcpy的区别 函数实现: 用法示例: 结果展示: 函数介绍 函数原型: char *strncpy(c ...

  7. strcat函数详解看这一篇就够了-C语言(函数实现、使用用法举例、作用、与strncat的区别)

    首先要明确strcat的功能是:将参数dest字符串和参数src字符串拼接起来 目录 函数介绍 与strncat的区别 函数实现: 用法示例: 结果展示: 函数介绍 函数原型:char* strcat ...

  8. memcpy函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)

    memcpy()函数用于:复制内存块 函数介绍 函数声明:void * memcpy ( void * destination, const void * source, size_t num ); ...

  9. strerror函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)

    strerror()函数用于:获取指向错误消息字符串的指针 函数介绍 函数声明: char * strerror ( int errnum ); 头  文  件:#include <string ...

最新文章

  1. 【基础知识】如何在word中粘贴出漂亮整洁的代码
  2. 从技术上还原入侵雅虎服务器是怎么一回事
  3. strange behavior:why u31000 is accessed for Extension project
  4. 云资源管理有助于减少服务滥用和开支
  5. 高位字节 低位字节_所有字节从何而来?
  6. 主从切换_“摸一摸”,乐在其中 | 雷柏i100蓝牙TWS耳机,主从切换,可单耳使用,也可双耳使用...
  7. * poj 3159 Candies 最短路 dijkstra堆优化
  8. [原创]java WEB学习笔记80:Hibernate学习之路--- hibernate配置文件:JDBC 连接属性,C3P0 数据库连接池属性等...
  9. 【报告分享】2021年营销数智化趋势洞察报告:深链经营孕育品牌发展新商机.pdf(附下载链接)...
  10. 剑指offer——11.旋转数组的最小数字
  11. SqlServer中Group By高级使用--Inner Join分组统计
  12. AsyncTask与Thread+Handler的区别、AsyncTask的使用
  13. 关键词组合工具_8大工具组合出击,解决扩量难题
  14. NB-IOT/LoRa/Zigbee无线组网方案对比
  15. Istio:服务发现和Pilot的架构机制
  16. python多个文件夹合并成一个文件夹
  17. java 代码的规范
  18. freemarker基于docx格式创建模板导出带图片pdf文件
  19. 基于STM32的反电动势无传感BLDC控制
  20. Shell脚本实现sshd黑名单

热门文章

  1. MIT CMU CS系列课程
  2. 今天早上进入你的空间突然发现咱们以前的东西都不见了,点开你的情侣空间........
  3. STM32F103标准固件库寄存器及常用函数整理
  4. 在Bootstrap模糊框中使用WebUploader的问题及解决方法
  5. 胡图图想学c语言呀3
  6. 面向初学者的 SQL Server 查询执行计划(1)——聚集索引运算符(Clustered Index)
  7. 如何在龙芯3B4000上部署基于.Net Core 开发的物联网平台IoTSharp
  8. 拓商:如何投资才能把店铺做起来
  9. jquery索引选择器
  10. 学编程要有哪些知识基础