Symbol 进阶底层详解(看这一篇就够了)
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 进阶底层详解(看这一篇就够了)相关推荐
- 代理后台中间件_Golang Gin 实战(十三)| 中间件详解看这一篇就够了
6000字大章带你死磕Golang Gin中间件 在Gin的整个实现中,中间件可谓是Gin的精髓.一个个中间件组成一条中间件链,对HTTP Request请求进行拦截处理,实现了代码的解耦和分离,并且 ...
- Java socket详解,看这一篇就够了
刚给大家讲解Java socket通信后,好多童鞋私信我,有好多地方不理解,看不明白.特抽时间整理一下,详细讲述Java socket通信原理和实现案例.整个过程楼主都是通过先简单明了的示例让大家了解 ...
- strstr函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )
strstr()函数用于:查找子字符串 目录 函数介绍 用法示例 函数讲解 实现函数 事例展示 函数介绍 函数声明:char *strstr(const char *str1, const char ...
- strtok函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用)
strtok()函数用于: 将字符串拆分为标记 函数介绍 函数声明:char * strtok ( char * str, const char * delimiters ); 头 文 件:#in ...
- memmove函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )
memmove()函数用于:移动内存块 函数介绍 函数声明:void * memmove ( void * destination, const void * source, size_t num ) ...
- strncpy函数详解看这一篇就够了-C语言(函数实现、使用用法举例、与strcpy的区别)
首先要明确strncpy的功能是:拷贝src字符串的前n个字符至dest 目录 函数介绍 与strcpy的区别 函数实现: 用法示例: 结果展示: 函数介绍 函数原型: char *strncpy(c ...
- strcat函数详解看这一篇就够了-C语言(函数实现、使用用法举例、作用、与strncat的区别)
首先要明确strcat的功能是:将参数dest字符串和参数src字符串拼接起来 目录 函数介绍 与strncat的区别 函数实现: 用法示例: 结果展示: 函数介绍 函数原型:char* strcat ...
- memcpy函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)
memcpy()函数用于:复制内存块 函数介绍 函数声明:void * memcpy ( void * destination, const void * source, size_t num ); ...
- strerror函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)
strerror()函数用于:获取指向错误消息字符串的指针 函数介绍 函数声明: char * strerror ( int errnum ); 头 文 件:#include <string ...
最新文章
- 【基础知识】如何在word中粘贴出漂亮整洁的代码
- 从技术上还原入侵雅虎服务器是怎么一回事
- strange behavior:why u31000 is accessed for Extension project
- 云资源管理有助于减少服务滥用和开支
- 高位字节 低位字节_所有字节从何而来?
- 主从切换_“摸一摸”,乐在其中 | 雷柏i100蓝牙TWS耳机,主从切换,可单耳使用,也可双耳使用...
- * poj 3159 Candies 最短路 dijkstra堆优化
- [原创]java WEB学习笔记80:Hibernate学习之路--- hibernate配置文件:JDBC 连接属性,C3P0 数据库连接池属性等...
- 【报告分享】2021年营销数智化趋势洞察报告:深链经营孕育品牌发展新商机.pdf(附下载链接)...
- 剑指offer——11.旋转数组的最小数字
- SqlServer中Group By高级使用--Inner Join分组统计
- AsyncTask与Thread+Handler的区别、AsyncTask的使用
- 关键词组合工具_8大工具组合出击,解决扩量难题
- NB-IOT/LoRa/Zigbee无线组网方案对比
- Istio:服务发现和Pilot的架构机制
- python多个文件夹合并成一个文件夹
- java 代码的规范
- freemarker基于docx格式创建模板导出带图片pdf文件
- 基于STM32的反电动势无传感BLDC控制
- Shell脚本实现sshd黑名单
热门文章
- MIT CMU CS系列课程
- 今天早上进入你的空间突然发现咱们以前的东西都不见了,点开你的情侣空间........
- STM32F103标准固件库寄存器及常用函数整理
- 在Bootstrap模糊框中使用WebUploader的问题及解决方法
- 胡图图想学c语言呀3
- 面向初学者的 SQL Server 查询执行计划(1)——聚集索引运算符(Clustered Index)
- 如何在龙芯3B4000上部署基于.Net Core 开发的物联网平台IoTSharp
- 拓商:如何投资才能把店铺做起来
- jquery索引选择器
- 学编程要有哪些知识基础