Symbol() 的使用方法
简介:ES5的对象属性名都是字符串,这就很容易造成属性名的冲突,比如一个项目很庞大,又不是一个人开发 的,就有可能会造成变量名冲突,如果有一个独一无二的名字就好了,这样就能从根本上防止属性名冲突。这就是ES6引入Symbol的原因。
ES6引入的是一种新的原始数据类型Symbol,表示独一无二的,它是JavaScript的第七种数据类型。Symbol值通过Symbol函数生成,只要属性名是属于Symbol类型的,就是独一无二的,可以保证不会与其他属性名产生冲突。
let s = Symbol();
typeof s;
//"symbol"
上面的代码中s 就是一个独一无二的值,typeof表明s 是symbol数据类型的。
注意:symbol函数前不能使用new关键字,否则会报错,这是因为symbol是原始数据类型,而不是对象,所以不能添加属性。
symbol可以接受一个字符串作为参数,表示对Symbol的描述,主要是在控制台显示时容易区分
var s1 = Symbol("foo");
var s2 = Symbol("bar");
s1 // Symbol("foo")
s2 // Symbol("bar")
s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)
这个参数可以不加,如果不加在控制台输出就是两个Symbol()不利于区分,加上参数就是为了加以区分。
没有参数的两个Symbol是不相等的,例如
// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol(); s1 == s2 // false // 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo"); s1 == s2 // false
无论有没有参数都是不相等的
Symbol不能与其他值进行运算,否则会报错
var s1 = Symbol("My Symbol");
"your symbol is" + s1;
// TypeError: can't convert symbol to string
`your symbol is ${s1}`
// TypeError: can't convert symbol to string
Symbole 可以显示的转为字符串,布尔值,但是不能转为数字
// 转为字符串
var s1 = Symbol("My Symbol"); String(s1) // "Symbol(My Symbol)"
s1.toString() // "Symbol(My Symbol)" //转为布尔值
var s1 = Symbol();
Boolean(s1) //true
!s1 //false if(s1) {
// ...
}
//转为数值就会报错
由于每一个Symbol都不相同,那么可以作为标识符作为对象的属性名,保证不会出现同名的的属性
var mySymbol = Symbol(); //第一种写法
var a = {};
a[mySymbol] = "Hello!"; //第二种写法
var a = {
[mySymbol]: "Hellow!"
} //第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: "Hellow!" }); //以上写法的结果都相同 a[mySymbol] // "Hellow!"
注意:Symbol值作为对象的属性名时不能使用点运算符,同理,在对象的内部使用Symbol值时也必须放在方括号中
let s = Symbol();
let obj = {
[s]: function(arg) {...}
}
//如果s不放在[]中,该属性名就是字符串,而不是Symbol
//可以采用增强的方式在书写上面的代码 let s = Symbol();
let obj = {
[s](arg) {...}
}
Symbol还可以定义一组常量,保证这组常量的值都是不相等的
const COLOR_RED = Symbol();
const COLOR_GREEN = Symbol(); function getComponent(color) {
switch(color) {
case: COLOR_RED:
return "red";
case: COLOR_GREEN:
return "green";
default:
throw new Error("Undefind color")
}
}
常量使用Symbol值最大的好处就是,其他任何值都不可能与之相同。
消除魔术字符串
魔术字符串就是指,在代码之中多次出现,与代码形成强耦合的某一个具体的字符串或数字,良好的代码风格应该消除魔术字符串,由含义清晰的变量代替。
function getArea(shape, options) {
var area = 0;
switch(shape) {
case: "Tringel": // 魔术字符串
area = 5*options.width*options.height;
break;
}
return area;
}
getArea("Tringel", {width: 100, height: 100}); // 魔术字符串
上面的字符串中 Tringel 就是一个魔术字符串,它多次出现,与代码形成强耦合,不利于将来的维护。
var shapeType = {
triangle: "Tringel"
}
function getArea(shape, options) {
var area = 0;
switch(shape) {
case: shapeType.triangle: // 消除魔术字符串
area = 5*options.width*options.height;
break;
}
return area;
}
getArea(shapeType.triangle, {width: 100, height: 100}); //消除魔术字符串
这里就很适合用Symbol来代替
var shapeType = {
triangle: Symbol()
}
Symbol() 的使用方法的更多相关文章
- 深入了解JavaScript中的Symbol的使用方法
这篇文章主要介绍了深入了解JavaScript中的Symbol的使用方法,本文针对ES6版本的JS进行讲解,需要的朋友可以参考下 Symbol 是什么? Symbols 不是图标,也不是指在代码中可以 ...
- Linux下Python3.5使用pyqt5.11报错 ImportError: /usr/local/lib/python3.5/dist-packages/PyQt5/QtCore.so: undefined symbol: PySlice_AdjustIndices 解决方法
我用的Linux自带的是Python3.5版本,运行pip3 install PyQt5, 下载的是PyQt5.11,运行PyQt5程序会报错: ImportError: /usr/local/lib ...
- xcode duplicate symbol _GAD_MD5 解决方法
添加了mobi的广告平台后,在Device状态打包时,出现此错误. duplicate symbol _GAD_MD5 in: 解决方法: Targets ->Build Setting 中设 ...
- psycopg2关于undefined symbol: lo_truncate64解决方法
今天,在centos6.5下安装psycopg2,利用Python连接PostgreSQL数据库的时候,出现了一个undefined symbol: lo_truncate6的错误: django.c ...
- LR 报错误: C interpreter run time error: Error -- Unresolved symbol : vuser_end解决方法
Action.c(33): Error: C interpreter run time error: Action.c (33): Error -- Unresolved symbol : vuse ...
- unresolved symbol @__security_check_cookie 解决方法
ntstrsafe.lib(output.obj) : error LNK2019: unresolved external symbol @__security_check_cookie@4 ref ...
- Symbol的isConcatSpreadable方法
Symbol.isConcatSpreadable 布尔值,对象用于Array.prototype.concat()时,是否可以展开 let arr1 = ['c', 'd']; ['a', 'b'] ...
- MAVEN 编译打包时报“找不到符号”cannot find symbol 的处理方法总结
http://www.cnblogs.com/Starshot/p/7441075.html
- ruby中symbol
Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...
随机推荐
- java web 数据库开发1
一个完整的数据库部署架构通常由客户端和服务器端两部分组成.客户端封装数据库请求将其发送给服务器端,服务器端执行完毕将其及结果返回给服务器端. 以mysql为例 介绍java应用程序对数据库的访问 JD ...
- spark 2.1.0 集群安装
jdk安装 http://www.cnblogs.com/xiaojf/p/6568426.html scala2.11 安装 http://www.cnblogs.com/xiaojf/p/6568 ...
- 第39篇 免费博客github Pages绑定域名
原文地址:http://blog.laofu.online/2017/06/02/how-bind-domain/ 网站已经有了,需要对网站来绑定一个自己的个性域名,本人是买了一个阿里云的域名,也就是 ...
- Python中lambda用法
lambda只是一个表达式,函数体比def简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去. lambda表达式是起到一个函数速写的作用.允 ...
- 移动端设置fixed布局的问题解决
最近写移动端,遇到一个问题就是用fixed属性布局的时候由于手机的原因会出现很多问题,比如说手机端底部固定一块,然后里面有输入框,(类似于手机QQ或者微信底部的输入框一样的布局)这个时候在调用软键盘的 ...
- 实现UDP高效接收/响应
环境Linux g++6.3.0 问题一:一个ip地址如何接收高并发请求 问题二:如何高并发响应消息 发送请求端只能通过ip地址+端口号向服务器发送请求码,所以服务器只能用一个UDP去绑定此ip以及端 ...
- {新人笔记 勿看} spring mvc第一步
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 使用SQL Server 发送邮件
在很多数据分析和集成的场景下,我们需要了解数据库中关键的脚本或者job的执行情况.这个时候邮件提醒是一种比较不错的通知方式.本文从零开始,一步一步的介绍如何使用SQL Server来发送邮件. 环境: ...
- 模拟jquery底层链式编程
//特点1:快级作用域,程序启动自动执行 //内部的成员变量,外部无法访问(除了var) //简单的函数链式调用 function Dog(){ this.run=function(){ alert( ...
- C# 禁止ALT+F4(钩子)
1. Windows Forms中禁用窗体的关闭按钮 添加必要的命名空间: using System.Runtime.InteropServices; 添加必要的常数和API函数的引用 priv ...