Symbol:一种新的原始数据类型
 
声明方式:
let s1 = Symbol()
let s2 = Symbol()
console.log(s1); // Symbol()
console.log(s2); // Symbol()
console.log(s1 === s2); // false let s3 = Symbol('foo');
let s4 = Symbol('bar');
console.log(s3); // Symbol(foo)
console.log(s4); // Symbol(bar)
console.log(s3 === s4); // false

  

如果Symbol声明时传入的参数是对象,会自动调用自身的toString方法:
const obj = {
name: '张三'
}
let s5 = Symbol(obj)
console.log(s5); // Symbol([object Object])

  

for方法:
使用for方法会在全局进行表述的定义,下次再使用for定义,会先去全局定义里面找有没有定义过的描述
let s6 = Symbol.for('foo')
let s7 = Symbol.for('foo') function foo() {
return Symbol.for('foo')
}
s8 = foo()
console.log(s6 === s7); // true
console.log(s6 === s8); // true

  

keyFor来查看你的Symbol有没在全局登记过:
const s9 = Symbol('foo')
const s10 = Symbol.for('foo')
console.log(Symbol.keyFor(s9)); // undefined
console.log(Symbol.keyFor(s10)); // foo

  

应用场景:
 
1、用Symbol保证对象的Key可以重名但是Key不相等,得到同时存在,
例如一个对象里面保存班级同学的信息,但是很有可能班级有重名的情况
const stu1 = Symbol('张三')
const stu2 = Symbol('张三')
const grade = {
[stu1]: {
address: 'aaa',
tel: '111'
},
[stu2]: {
address: 'bbb',
tel: '222'
},
}
console.log(grade);
console.log(grade[stu1]);
console.log(grade[stu2]);

  

2、使用Symbol可以相对隐藏类的实例属性

const sym = Symbol('age')
class User {
constructor(name) {
this.name = name
this[sym] = 18
}
getName() {
console.log('getName:' + this.name + ' age:' + this[sym])
}
} const user = new User('张三')
user.getName()
// for in是读取不到sym属性
for (let key in user) {
console.log(key);
}
// keys读取不到sym属性
for (let key of Object.keys(user)) {
console.log(key);
}
// getOwnPropertySymbols只能读取Symbol属性
for (let key of Object.getOwnPropertySymbols(user)) {
console.log(key);
}
// Reflect.ownKeys既可以读取一般实例属性,也可以读取Symbol属性
for (let key of Reflect.ownKeys(user)) {
console.log(key);
}

  

3、消除魔术字符串

什么是魔术字符串?如下代码:

这里的aaa,bbb就是魔术字符串,需要来回编写,而且只要原方法修改,另外地方也要跟着修改
function getArea(str) {
let area = 0
switch (str) {
case 'aaa':
area = 1
break
case 'bbb':
area = 2
break
}
return area
}
console.log(getArea('aaa'))

  

使用对象来消除魔术字符串
/*
const strType = {
aaa: 'aaa',
bbb: 'bbb',
}
*/
// 由于上面value其实并不需要关心是什么字符串,所以可以用Symbol来代替
const strType = {
aaa: Symbol(),
bbb: Symbol(),
} function getArea2(str) {
let area = 0
switch (str) {
case strType.aaa:
area = 1
break
case strType.bbb:
area = 2
break
}
return area
}
console.log(getArea2(strType.aaa))

  

ES6-11学习笔记--Symbol的更多相关文章

  1. C++11 学习笔记 std::function和bind绑定器

    C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...

  2. js-ES6学习笔记-Symbol

    1.ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null.布尔值(Boolean).字符串(String ...

  3. 【转】js-ES6学习笔记-Symbol

    原文:https://www.cnblogs.com/zczhangcui/p/6435652.html https://blog.mgechev.com/2017/09/16/developing- ...

  4. es6学习笔记-Symbol

    概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制 ...

  5. es6.3学习笔记

    es版本发布相当快,从1.x到2.x,再直接到5.x,6.x 索引这个词在es中有多重意思: 索引(名词):一个索引类似于传统数据库中的一个索引,用于存储关系型文档.索引的复数为indexes或ind ...

  6. es6小白学习笔记(一)

    1.let和const命令 1.es6新增了let和const命令,与var用法类似,但它声明的变量只在let所在的代码块内有效(块级作用域,es5只有全局和函数作用域) { let a = 1; v ...

  7. C++11学习笔记

    C++11 1.long long新类型 2.列表初始化 int t=0; int t={0}; int t(0); int t{0}; 注意:如果我们使用列表初始化有丢失信息的风险,则编译器报错 l ...

  8. linux0.11学习笔记(1)

    公布软件包包括内容: bootimage.Z - 具有美国键盘代码的压缩启动映像文件: rootimage.Z - 以1200kB 压缩的根文件系统映像文件: linux-0.11.tar.Z- 内核 ...

  9. JavaScript(ES6)学习笔记-Set和Map数据结构(一)

    一.Set 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. , , , , ']); s; // ...

  10. ES6 promise学习笔记 -- 基本用法

    ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个Promise实例. const promise = new Promise(function(reso ...

随机推荐

  1. 扩展我们的分析处理服务(Smartly.io):使用 Citus 对 PostgreSQL 数据库进行分片

    原文:Scaling Our Analytical Processing Service: Sharding a PostgreSQL Database with Citus 在线广告商正在根据绩效数 ...

  2. 关于Web的一些知识,Web怎么构成?

    前端学习:学习地址:黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动,下面这些都是一些学习笔记.临渊羡鱼,不如退而结网!!愿我自己学有所成,也愿每个前端爱好者学有所成 ...

  3. 矩池云上如何快速安装tensorRT

    国内镜像 https://mirrors.cloud.tencent.com/nvidia-machine-learning/ubuntu1804/x86_64/ 检查系统版本 source /etc ...

  4. XSHELL的坑

    今天使用XSHELL连接虚拟机上的CENTOS7 ,刚开始还可以正常连接,后来再就连接不上. 检查了半天SSH服务都检查过了运行正常, 重启,检查配置文件. 都OK没问题就是连接不上,折腾半天还是不行 ...

  5. 最小生成树MST算法(Prim、Kruskal)

    最小生成树MST(Minimum Spanning Tree) (1)概念 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边,所谓一个 ...

  6. Spring Boot 中初始化资源的几种方式

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

  7. rsync同步文件到远程机器,卡住10多秒--问题解决过程

    背景 以前大体介绍过,我们这边是做运维平台的.如果要形象化理解,那么,比如jenkins这种喜闻乐见的软件大致了解吧,jenkins就经常需要同步文件/版本包到远程机器上,jenkins怎么实现的,没 ...

  8. dpwwn-01

    环境配置 靶机下载地址: https://download.vulnhub.com/dpwwn/dpwwn-01.zip 下载好解压打开.vmx文件即可 启动后如图: 无法直接获得靶机ip,用kali ...

  9. java高级用法之:调用本地方法的利器JNA

    目录 简介 JNA初探 JNA加载native lib的流程 本地方法中的结构体参数 总结 简介 JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做java native inter ...

  10. k8s集群搭建过程详解

    准备工作 安装CentOS7虚拟机 略 安装Docker 略 关闭CentOS7自带的防火墙服务 systemctl disable firewalld systemctl stop firewall ...