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 ...
随机推荐
- 一、 开篇(ASP.NET MVC5 系列)
这个教程将教你一些用VS2013创建ASP.NET MVC 5 Web应用程序基础知识.为了避免开发工具的不一致而带来的一些小麻烦,建议你使用和我一样的开发工具VS2013英文版. 开发工具:Visu ...
- NFS文件共享
NFS文件共享 简介 NFS即网络文件系统(network file system),监听在TCP 2049端口. 服务器需要记住客户端的ip地址以及相应的端口信息,这些信息可以委托给RPC(remo ...
- OpenCV中的结构体、类与Emgu.CV的对应表
OpenCv中的 C 结构 OpenCV中的 C++ 封装 Emgu.CV中的 C# 封装 OpenCV 和 Emgu.CV 中的结构罗列 谢谢阅读,有误希望指正 原文地址 Basic Structu ...
- Go从入门到精通(一)go语言初始
一.第一个go程序 package main import ( "fmt" ) func main(){ fmt.Println("hello world") ...
- python学习-面向对象
面向对象 编程方式的区别 过程式编程 函数式编程 面向对象式编程 面向对象编程 对象是类的一个实例 创建 class foo(): def __init__(self): #类的构造方法 pass d ...
- 13.ThreadPoolExecutor线程池之submit方法
jdk1.7.0_79 在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...
- python大规模爬取京东
python大规模爬取京东 主要工具 scrapy BeautifulSoup requests 分析步骤 打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点 我们可以看到这个页面 ...
- ionic中点击图片看大图的实现
在页面上显示了几张图片后,因为是手机端,图片会有点小的感觉,就想着怎么样才能让用户点击小图片看到大图呢,项目中ionic结合angularjs实现了这个功能 1.首先是三张小图上应添加一个函数,当点击 ...
- EJB系列 - 会话Bean基础知识
本人博客文章网址:https://www.peretang.com/basic-knowledge-of-session-bean/ 什么是会话 有限的时间周期内,客户端和服务器之间的连接 为什么使用 ...
- DB2简介和安装部署
一.DB2相关概念 1.DB2体系结构: DB2体系结构中的最高一层是系统,一个系统表示DB2的一个安装.在由很多机器组成 的网络环境中,我们有时=也称系统为数据库分区,一个系统可以包含多个DB2实例 ...