ECMA Script 6_Symbol() 唯一类型值声明函数_Symbol 数据类型
Symbol 数据类型
let s = Symbol(); typeof s; // "symbol"
是 ES6 继 Number,String,Boolean,Undefined,Null 之后引入的新数据类型
对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。
Symbol 函数的参数只是表示对当前 Symbol 值的描述
let s1 = Symbol('foo');
let s2 = Symbol('bar'); s1 // Symbol(foo)
s2 // Symbol(bar) s1.toString(); // "Symbol(foo)"
s2.toString(); // "Symbol(bar)"
凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
背景:
ES5 的对象属性名都是字符串,这容易造成属性名的冲突
如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。
- 原始数据类型
Symbol
表示独一无二的值。
它是 JavaScript 语言的第七种数据类型
Symbol 值可以显式转为字符串
Symbol 值可以显式转为布尔值
- Symbol 值不能与其他类型的值进行运算,会报错
即使 Symbol函数参数相同,但是它们是不相等的。- Symbol 值 作为对象的属性时,只能用 [ ] 访问进行读写
在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中
let s = Symbol();
let obj = {
[s]: function (arg) { ... }
}; obj[s]();- 常量使用 Symbol 值最大的好处,就是其他任何值都不可能有相同的值了,因此可以保证上面的
switch语句会按设计的方式工作 const COLOR_RED = Symbol();
const COLOR_GREEN = Symbol(); function getComplement(color) {
switch (color) {
case COLOR_RED:
return COLOR_N:
return COLOR_GREEN;
case COLOR_GREERED;
default:
throw new Error('Undefined color');
};
};- 消除魔术字符串的方法,就是把它写成一个变量
const shapeType = {
triangle: Symbol(),
}; function getArea(shape, options) {
let area = 0;
switch (shape) {
case shapeType.triangle:
area = .5 * options.width * options.height;
break;
};
return area;
}; getArea(shapeType.triangle, { width: 100, height: 100 });- Symbol 作为属性时,非私有属性,遍历法
- Symbol 作为属性名,该属性不会出现在
for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回 - 但是,它也不是私有属性,有一个
Object.getOwnPropertySymbols()获取指定对象的所有 Symbol 属性名。 - 重新使用同一个 Symbol 值,Symbol.for('aName')
接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。
- 如果有,就返回这个 Symbol 值
- 否则就新建并返回一个以该字符串为名称的 Symbol 值
let s1 = Symbol.for('foo'); // 登记在全局环境中供搜索
let s2 = Symbol.for('foo'); // 登记在全局环境中供搜索 s1 === s2 // true
Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。
它们的区别是:
前者会被登记在全局环境中供搜索,后者不会。
Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。
比如,如果你调用Symbol.for("cat")30 次,每次都会返回同一个 Symbol 值,
但是调用Symbol("cat")30 次,会返回 30 个不同的 Symbol 值
Symbol.keyFor() 返回一个已登记的 Symbol 类型值的key,即 Symbol.for() 生成的 Symbol 值注意: 为 Symbol 值登记的名字,是全局环境的,可以在不同的 iframe 或 service worker 中取到同一个值let obj = {
[Symbol('my_key')]: 1,
enum: 2,
nonEnum: 3
}; Reflect.ownKeys(obj); // ["enum", "nonEnum", Symbol(my_key)]
ECMA Script 6_Symbol() 唯一类型值声明函数_Symbol 数据类型的更多相关文章
- c++学习笔记之基础---类内声明函数后在类外定义的一种方法
在C++的“类”中经常遇到这样的函数, 返回值类型名 类名::函数成员名(参数表){ 函数体.} 双冒号的作用 ::域名解析符!返回值类型名 类名::函数成员名(参数表) { 函数体. } 这个是在类 ...
- ECMA Script 6_唯一容器 Set_映射容器 Map
唯一容器 Set ES6 提供了新的数据结构 Set Set 结构没有键名,只有键值(或者说 键名 和 键值 是同一个值) 它类似于数组,但是成员的值都是唯一的,没有重复的值 Set 内部判断两个值是 ...
- ECMA Script 6_symbol(symbol.iterator) 新接口_iterator接口
iterator 接口 只要部署了 iterator 接口 symbol(symbol.iterator), 则可以进行 for...of 遍历
- C++中怎么获取类的成员函数的函数指针?
用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...
- 你好,C++(32) 类是对现实世界的抽象和描述 6.2.1 类的声明和定义
6.2 类:当C++爱上面向对象 类这个概念是面向对象思想在C++中的具体体现:它既是封装的结果,同时也是继承和多态的载体.因此,要想学习C++中的面向对象程序设计,也就必须从“类”开始. 6.2. ...
- C++多态性中基类析构函数声明为虚函数
在用基类指针指向派生类时, 在基类析构函数声明为virtual的时候,delete基类指针,会先调用派生类的析构函数,再调用基类的析构函数. 在基类析构函数没有声明为virtual的时候,delete ...
- TypeScript基础类型,类实例和函数类型声明
TypeScript(TS)是微软研发的编程语言,是JavaScript的超集,也就是在JavaScript的基础上添加了一些特性.其中之一就是类型声明. 一.基础类型 TS的基础类型有 Boolea ...
- (C++)浅谈多态基类析构函数声明为虚函数
主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对 ...
- c++学习笔记之基础---类内声明线程函数的调用
近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数exec_task中调用pthread_create去启动线程执行例程thread_rounter.编译之后报错如下: spf ...
随机推荐
- 我对SAP Business One 项目实施的理解
一.什么是SAP: 大家都知道ERP是什么,ERP是企业资源计划管理系统.是指建立在信息技术基础上,集信息技术与先进管理思想于一身,以系统化的管理思想,为企业员工及决策层提供决策手段的管理平台.那么问 ...
- canvas绘图工具
关于canvas绘图,在html页面上太方便了.当然刚开始还是入了不少坑,用了比如jcanvascript等三方插件.真实效果反而不理想,后来就没用插件. 下面是实现效果,可以在线绘制工地图然后传给后 ...
- DirectX11 With Windows SDK--16 流输出阶段
前言 在上一章,我们知道了如何使用几何着色器来重新组装图元,比如从一个三角形分裂成三个三角形.但是为了实现更高阶的分形,我们必须要从几何着色器拿到输出的顶点.这里我们可以使用可选的流输出阶段来拿到顶点 ...
- 异常-CDH的service无法启动并抛出异常-org.apache.avro.AvroRemoteException: java.net.ConnectException: Connection refused (Connection refused)
1 详细异常 org.apache.avro.AvroRemoteException: java.net.ConnectException: Connection refused (Connectio ...
- 3D Slicer中文教程(四)—图像分割
1.数据获取 (1)下载3D Slicer自带的样本数据 (2)选择自由的数据 (3)网上数据库等其他方式下载数据 2.分割工具 Segment Editor是一个用于分割的模块.细分(也称为轮廓)描 ...
- 错误: H.264 bitstream malformed, no startcode found,
使用命令 ffmpeg -i hbg.flv -c copy hbg.ts 时遇到如下错误: ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) ...
- centos7.6环境下编译安装tengine-2.2.2的编译安装
centos7.6环境下编译安装tengine-2.2.2的编译安装 .获取tengine2..2的源码包 http://tengine.taobao.org/download/tengine-2.2 ...
- 【原创】大叔问题定位分享(14)Kylin频繁OOM问题
公司一个kylin集群,每到周二下午就会逐个节点OOM退出,非常有规律,kylin集群5个节点,每个节点分配的内存已经不断增加到70多G,但是问题依旧: 经排查发现,每周二下午kylin集群的请求量确 ...
- 字符串(2)KMP算法
给你两个字符串a(len[a]=n),b(len[b]=m),问b是否是a的子串,并且统计b在a中的出现次数,如果我们枚举a从什么位置与匹配,并且验证是否匹配,那么时间复杂度O(nm), 而n和m的范 ...
- python 的bif
函数在类里面就叫做方法from sys import pi 导入sys模块里面的pi方法import sys as system 命名为新的名字dir(sys) 查看sys模块里面都提供了哪些东西he ...