JavaScript – Symbol
前言
Symbol 是 es6 的特性. 如果只是写业务逻辑代码, 其实是不太会用到的. 如果是做架构, 封装, UI 组件才有需要.
但学它的概念是好的. es6 有需要内置的 Symbol 链接者许多常用的功能, 如果想修改这些 build-in 的东西, 了解 Symbol 是必须的.
参考
没有钱买阮老师的书支持, 在这里帮忙推荐一下, 想学 JavaScript 新手, 或新手进阶都很适合读.
Unique String
调用 Symbol 方法, 传入一个 name 或者叫 description 就会返回一个 Symbol (不需要 new 哦)
const mySymbol1 = Symbol('name');
const mySymbol2 = Symbol('name');
console.log(mySymbol1 === mySymbol2); // false
Symbol 的特色是它即使用同一个 name 创建出来, 但 Symbol 却是不同的.
有时候写代码时, 我们会用一些特别字符串 (hardcode) 做判断. 这样不太好, 因为不可以 rename 全场换. 把它装入到 Symbol 就剪掉了这种耦合关系.
Symbol Description
const mySymbol1 = Symbol('name');
console.log(mySymbol1.description === 'name'); // true
通过 description 可以拿回初始化时传入的 name
Symbol in Object
其实这个才是重点. Symbol 可以作为 object 的 key.
const mySymbol1 = Symbol('name');
const obj = {
name: 'Derrick',
[mySymbol1]: 'value',
};
console.log(obj[mySymbol1] === 'value'); // value
console.log(Object.keys(obj)); // ['name']
console.log(Object.getOwnPropertySymbols(obj)); // [mySymbol1]
console.log(Reflect.ownKeys(obj)); // ['name', mySymbol1]
注意, 获取 symbol key 的方式, 我们常用的 Object.keys 是遍历不到 Symbol 的.
为什么说这个才是重点呢? 因为 es6 用了许多 build-in 的 Symbol 在各种 object 上.
实现了许多方法. 比如最有名的 Symbol.iterator. 总共有 11 种 build-in Symbol.
从这里就可以明白, 为什么 Symbol 是 unique 的, 因为它需要放到 object key 里头, 用 string 会撞名字.
此外因为有这些 build-in Symbol, 所以 Object.keys 默认遍历不出来.
Symbol 的 best practice 就是像那么 build-in 的 Symbol 那样使用. 下面介绍几个比较火的.
Build-in Symbol
Symbol.hasInstance
class MyClass {
[Symbol.hasInstance](foo) {
return foo instanceof Array;
}
}
[1, 2, 3] instanceof new MyClass() // true
看明白了吗, instanceof 其实是调用了对象里面 Symbol.hasInstance 的方法.
Symbol.Split
const array = 'abc'.split({
[Symbol.split](value) {
console.log(value === 'abc'); // true
return ['a', 'b', 'c'];
},
});
console.log(array); // ['a', 'b', 'c']
string 的 split 方法, 参数 seperator 除了可以是 string | Regex 以外还可以是一个带有 Symbol.split 的对象.
Symbol.iterator
任何对象, 一旦有了 Symbol.iterator 就变成了迭代器. 可以被 for of 遍历.
const myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
[...myIterable] // [1, 2, 3]
Symbol.toPrimitive
控制当对象被类型转换时的逻辑
let obj = {
[Symbol.toPrimitive](hint) {
switch (hint) {
case 'number':
return 123;
case 'string':
return 'str';
case 'default':
return 'default';
default:
throw new Error();
}
}
};
2 * obj // 246
3 + obj // '3default'
obj == 'default' // true
String(obj) // 'str'
hint = number 意思是, 对象要被转去 number 了, 这时就应该返回一个数字.
default 的意思是可能是转成 number, 也可能是 string. (这个比较难理解)
据这个例子主要是让你体会一下 Symbol 搭配 object 和各种操作场景下, 它是如果运作的.
总结
Symbol 主要的玩法就像诸多 build-in Symbol 那样. 操作语法 + 对象 Symbol = resul
JavaScript – Symbol的更多相关文章
- JavaScript Symbol对象
JavaScript Symbol对象 Symbol Symbol对象是es6中新引进的一种数据类型,它的作用非常简单,就是用于防止属性名冲突而产生. Symbol的最大特点就是值是具有唯一性,这代表 ...
- Javascript Symbol 隐匿的未来之星
ES6中基础类型增加到了7种,比上一个版本多了一个Symbol,貌似出现了很长时间,但却因没有使用场景,一直当作一个概念层来理解它,我想,用它的最好的方式,还是要主动的去深入了解它吧,所以我从基础部分 ...
- JavaScript Symbol
创建: 2019/02/26 完成: 2019/02/26 生成 每次生成的值都不一样(===, ==都是) var sym = Symbol(); // 可以有参数, 是对symbol的说明 v ...
- 【翻译】MongoDB指南/引言
[原文地址]https://docs.mongodb.com/manual/ 引言 MongoDB是一种开源文档型数据库,它具有高性能,高可用性,自动扩展性 1.文档数据库 MongoDB用一个文档来 ...
- MongoDB学习笔记-数据格式及数据类型
JSON JSON是一种简单的数据表示方式,它易于理解.易于解析.易于记忆.但从另一方面来说,因为只有null.布尔.数字.字符串.数组和对象这几种数据类型,所以JSON有一定局限性.例如,JSON没 ...
- MongoDB - Introduction to MongoDB, BSON Types
BSON is a binary serialization format used to store documents and make remote procedure calls in Mon ...
- Windows下安装配置MongoDB
Windows下安装配置MongoDB 一,介绍 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB ...
- mongoDB 文档概念
mongoDB 文档概念 什么是文档 文档是 mongodb 基本的数据组织单元,类似于mysql 中的记录 文档由多个键值对组成,每个键值对表达一个数据项 属于 bson 数据 ps: bson ...
- MongoDB的数据类型介绍
参考MongoDB官网:https://docs.mongodb.com/manual/reference/bson-types/ MongoDB文档存储是使用BSON类型,BSON(BSON sho ...
- 使用mongo shell转换字符类型
MongoDB数据类型如下: 类型 对应数字 别名 说明 Double1 1 double String 2 string Object 3 object Array 4 array ...
随机推荐
- 要想业务中台建得快,最好用Service Mesh来带
中国企业数字化转型进入深水区,业务中台及下一代微服务Service Mesh(服务网格)被越来越多的人关注,本文结合网易轻舟微服务Service Mesh实践,解析业务中台为什么需要Service M ...
- Mysql实现主从复制(一主双从)
一.环境介绍 LNMP(centos7,mysql5.6) vmware workstation pro配置了3个虚拟机,均安装了LNMP环境: master: 192.168.0.105 slav ...
- MViTv2:Facebook出品,进一步优化的多尺度ViT | CVPR 2022
论文将Multiscale Vision Transformers (MViTv2) 作为图像和视频分类以及对象检测的统一架构进行研究,结合分解的相对位置编码和残差池化连接提出了MViT的改进版本 来 ...
- 《Programming from the Ground Up》阅读笔记:p75-p87
<Programming from the Ground Up>学习第4天,p75-p87总结,总计13页. 一.技术总结 1.persistent data p75, Data whic ...
- 【Node】下载安装(Linux)
不要使用源码包安装!!!编译时间太长!! 不要使用源码包安装!!!编译时间太长!! 不要使用源码包安装!!!编译时间太长!! 使用Node源码包安装 这里使用的是源码包安装 Node官网地址:也不是官 ...
- 【OracleDB】 10g 安装(Windows)
Win7系统环境建议右键[管理员身份运行] - 指明选择的安装目录在哪[只更换盘符即可,对官方默认的目录不更改] - 安装类型选择企业版 - 安装Oracle的同时创建数据库服务[数据库] - 口令即 ...
- 【Lodop】02 C-Lodop手册阅读上手
版本:4.0.6.2 一.概述 C-Lodop云打印是一款精巧快捷的云打印服务产品,以Lodop功能语句为基础,JS语句实现远程打印 移动设备+Wifi+普通打印机+集中打印 C-Lodop对客户端浏 ...
- 如何在python同一应用下的多模块中共享变量
最近在考虑编码风格的问题,突然想到如何在一个python应用下的多个模块中共享一个变量.最早接触python还是在python2.5版本左右,那个时候由于python的import规则设定的问题导致本 ...
- Chrome(Google) 浏览器安装Vue2、Vue3插件方法 (亲测有效)
1.背景 2.步骤 步骤一:下载插件 网站:https://chrome.zzzmh.cn/#/search 百度网盘下载: 链接:https://pan.baidu.com/s/1xdEK-7qVx ...
- SMU Summer 2023 Contest Round 7
SMU Summer 2023 Contest Round 7 A. Two Rival Students 答案不能大于 \(n-1\): 如果竞争对手之间的当前距离小于 \(n - 1\) ,我们总 ...