ES6 之 第七种数据类型Symbol
概述
为了减少对象的属性名冲突,ES6引入新的原始数据类型Symbol,JS的第七种数据类型。
Symbol 能够保证每个属性的名字都是独一无二,这样就能从根本上防止属性名冲突。
Symbol 值能够通过Symbol函数生成,也就是说,对象的属性名现在可以有2种类型,一种就是原来的字符串,另一种就是新增的Symbol 类型。
let s = Symbol()
console.log(s) // Symbol()
Symbol函数前不使用new命令,因为生成的Symbol是一个原始类型的值,不是对象,那么,也就不能添加属性(类似于字符串的数据类型)
Symbol函数乐意接受一个字符串作为参数,表示Symbol实例的描述,主要是为了在控制台显示,或者转化为字符串为了区分(注意,相同参数返回值是不相同的!)
let s1 = Symbol('s1')
let s2 = Symbol('s2')
let s3 = Symbol('s2')
console.log(s1,s2) // Symbol(s1) Symbol(s2)
console.log(s1.toString(),s2.toString()) // Symbol(s1) Symbol(s2)
console.log(s2 == s3) // false
console.log(s2 === s3) // false
作为属性名的Symbol
Symbol值可以作为标识符用于对象的属性名,保证不会出现同名的属性。这对于一个对象有多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。
let mySymbol = Symbol()
/** 第一种写法 */
let a1 = {}
a1[mySymbol] = 'holle!'
/**第二种写法 */
let a2 = {
[mySymbol]: 'holle!'
}
/**第三种写法 */
let a3 = {}
Object.defineProperty(a3, mySymbol, { value: 'holle!'}) console.log(a1[mySymbol]) // holle!
console.log(a2[mySymbol]) // holle!
console.log(a3[mySymbol]) // holle!
注意:Symbol值作为对象的属性名不能使用点运算符,点后面是字符串,不是Symbol类型!
同理。在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号中
Symbol定义常量
常量使用Symbol值的最大的好处就是,其他任何值都不可能有相同的值了。
let log = {}
log.levels = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
WARN: Symbol('warn')
} console.log(log.levels.DEBUG, log.levels.INFO) // Symbol(debug) Symbol(info)
消除魔术字符串
魔术字符串是指,在代码中多次出现、与代码形成强耦合的某一个具体字符串或数值。风格良好的代码,应该尽量消除魔术字符串,而又含义清晰的变量代替。
/* 字符串Triangle就是一个魔术字符串。它多次出现,与代码形成“强耦合”,不利于将来的修改和维护。 */
function getArea(shape, options) {
let area = 0;
switch (shape) {
case 'Triangle': // 魔术字符串
area = .5 * options.width * options.height;
break; /* ... more code ... */
}
return area;
} getArea('Triangle', {
width: 100,
height: 100
}); // 魔术字符串
常用的消除魔术字符串的方法,就是把它写成一个变量。
const shapeType = {
triangle: 'Triangle'
}; 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
});
我们把Triangle写成shapeType对象的triangle属性,这样就消除了强耦合。
可以发现shapeType.triangle等于哪个值并不重要,只要确保不会跟其他shapeType属性的值冲突即可。
const shapeType = {
triangle: Symbol()
};
属性名的遍历
Symbol 属性遍历:Object.getOwnPropertySymbols 方法获取指定对象的所有Symbol 属性。
let keySymbolName = Symbol('name')
let keySymbolAge = Symbol('age')
var a = {
[keySymbolName]: 'houfee',
[keySymbolAge]: 24
}
let arr = Object.getOwnPropertySymbols(a)
console.log(arr); // [Symbol(name), Symbol(age)]
ES6 之 第七种数据类型Symbol的更多相关文章
- 【面试题】JS第七种数据类型Symbol详解
JS第七种数据类型Symbol详解 点击打开视频讲解更加详细 一.什么是Symbol? Symbol是ES6中引入的一种新的基本数据类型,用于表示一个独一无二的值.它是JavaScript中的第 七种 ...
- Symbol -- JavaScript 语言的第七种数据类型
ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证 ...
- ES6学习笔记(八)第七种类型Symbol
1.概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种 ...
- 细说 JavaScript 七种数据类型
在 JavaScript 规范中,共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined ...
- JavaScript 七种数据类型
在 JavaScript 规范中,共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined ...
- JavaScript的七种数据类型
我知道这个话题网上说法非常多,甚至还有分出什么"Array,Function"之类的阿猫阿狗的类型.今天来整理这个话题的时候,先贴一张MDN官方的说法: 这个分法是对的,也是目前来 ...
- JavaScript中七种数据类型·中·一
Standing on Shoulders of Giants; 说到JavaScript里的类型很容易就让人想起 42和"42",分别是string型和number型,但是他们可 ...
- php 七种数据类型介绍
PHP有7个数据类型.七个类型: 字符串, 整数, 浮动, 布尔, 数组, 对象, 资源. 字符串 字符串保持字符,如“一”.“abc”,“www.manongjc.com”等.PHP字符串是区分大小 ...
- 面试中经常问到的Redis七种数据类型,你都真正了解吗?
前言 Redis不是一个简单的键值对存储,它实际上是一个支持各种类型数据结构的存储.在传统的键值存储中,是将字符串键关联到字符串值,但是在Redis中,这些值不仅限于简单的字符串,还可以支持更复杂的数 ...
随机推荐
- hadoop ozone入门
简介 众所周知,HDFS是大数据存储系统,并在业界得到了广泛的使用.但是无论大集群还是小集群其扩展性都受NameNode的限制,虽然HDFS可以通过Federation进行扩展,但是依然深受小文件和4 ...
- tornado结合前端进行文件上传
在表单中我们获取用户提交的数据,使用的是get_argument,复选框使用的是get_arguments,但是文件的不一样,文件的使用request.files. form文件上传 html代码: ...
- Yarn的资源调优
一.概述 每个job提交到yarn上执行时,都会分配Container容器去运行,而这个容器需要资源才能运行,这个资源就是Cpu和内存. 1.CPU资源调度 目前的CPU被Yarn划分为虚拟CPU,这 ...
- linux后台运行jar
1. 在linux服务器上运行Jar文件时通常的方法是: $ java -jar test.jar 这种方式当ssh窗口关闭时,程序中止运行,或者是运行时没法切出去执行其他任务 2. 保持程序后台运行 ...
- UVA - 10635 Prince and Princess(LCS,可转化为LIS)
题意:有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n2的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 分析: A = {1,7,5,4,8,3, ...
- maven集成SSM项目,Tomcat部署运行——SSM整合框架搭建(二)之问题
问题一.当放开controller中的方法,出现如下问题 ### Error querying database. Cause: org.springframework.jdbc.CannotGetJ ...
- 配置多个数据源datasource
https://www.jianshu.com/p/34730e595a8c @Primary.@Qualifire.@Autowired.@Resource https://blog.csdn.ne ...
- 如何让手游内存占用更小?从内存消耗iOS实时统计开始
为什么iOS内存使用过多会崩溃,性能会下降?腾讯游戏学院专家Devlin在本文给了解释,如何让手游内存占用更小?从内存消耗iOS实时统计开始. 一.问题 在之前的手游项目中,内存使用过多,都开始崩溃了 ...
- Mysql:分支结构—case结构
case结构 情况一:类似于家擦中的switch语句 一般用于实现等值判断 语法: CASE 变量|表达式|字段 WHEN 要判断的值 THEN 返回的值1或语句1; WHEN 要判断的值 THEN ...
- slf4j NoSuchMethodError 错误 ---- 版本冲突
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/Stri ...