ES6中Symbol类型用法实例详解


Posted in Javascript onApril 06, 2017

本文实例讲述了ES6中的Symbol类型。分享给大家供大家参考,具体如下:

Symbol是在ES6中新加入的类型。

正如我们所知,JavaScript中有以下几种类型:

Undefined ,Null ,Boolean ,Number ,String, Object

但是上述类型在处理某些情况的时候是远远不够的。下面我们来举一个例子:

假设我们要移动div,也需要在某些情况下判断该div是否处于移动状态,所以我们会想到给div这类的对象设置一个属性。

if (element.isMoving) {
 smoothAnimations(element);
}
element.isMoving = true;

但是这样会存在一些问题,比如:

我们可能和第三方的库冲突

我们可能和未来的标准冲突等

于是可以采用第二种方法,也就是采用加密函数,制定一个值:

var isMoving = SecureRandom.generateName();
...
if (element[isMoving]) {
 smoothAnimations(element);
}
element[isMoving] = true;

这样确实解决了冲突问题,但却带来了调试问题,我们每次查看该对象属性时都会看见一大堆垃圾命名。

于是为了解决冲突问题,ES6提出了Symbol这样的新类型。

Symbol是一种特殊的、不可变的数据类型,可以作为对象属性的标识符使用。我们看demo:

var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");

Symbol("foo") 不会强制字符串 "foo" 进入一个Symbol,它每次都创建一个新的Symbol

Symbol("foo") === Symbol("foo"); // false

所以可以利用这个特性来创建私有属性:

(function() {
 // 创建symbol
 var key = Symbol("key");
 function MyClass(privateData) {
  this[key] = privateData;
 }
 MyClass.prototype = {
  doStuff: function() {
   ... this[key] ...
  }
 };
})();
var c = new MyClass("hello")
c["key"] === undefined//无法访问该属性,因为是私有的

也可以利用Symbol来解除上面所说的冲突问题:

// create a unique symbol
var isMoving = Symbol("isMoving");
...
if (element[isMoving]) {
 smoothAnimations(element);
}
element[isMoving] = true;

当然,也可以通过另外的调用方法来生成可以与外界共享的Symbol类型,就是Symbol.for方法

Symbol.for(key) 方法会根据给定的键 key,来从 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入 symbol 注册表中。

Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"
Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol
Symbol.for("bar") === Symbol.for("bar"); // true,证明了上面说的
Symbol("bar") === Symbol("bar"); // false,Symbol() 函数每次都会返回新的一个 symbol
var sym = Symbol.for("mario");
sym.toString();
// "Symbol(mario)",mario 既是该 symbol 在 symbol 注册表中的键名,又是该 symbol 自身的描述字符串

所以为了防止冲突,我们最好给symbol带上前缀:

Symbol.for("mdn.foo");
Symbol.for("mdn.bar");

希望本文所述对大家ECMAScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
jquery实现动态改变div宽度和高度
May 08 Javascript
javascript中的面向对象
Mar 30 Javascript
JavaScript实现瀑布流图片效果
Jun 30 Javascript
vue实现学生录入系统之添加删除功能
Jul 11 Javascript
layui结合form,table的全选、反选v1.0示例讲解
Aug 15 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
JS实现带阴历的日历功能详解
Jan 24 Javascript
JS数组进阶示例【数组的几种函数用法】
Jan 16 Javascript
jQuery HTML获取内容和属性操作实例分析
May 20 jQuery
微信小程序换肤功能实现代码(思路详解)
Aug 25 Javascript
微信小程序实现录音Record功能
May 09 Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 #Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 #Javascript
HTML中使背景图片自适应浏览器大小实例详解
Apr 06 #Javascript
ES6中的箭头函数实例详解
Apr 06 #Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 #Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 #Javascript
javascript中this用法实例详解
Apr 06 #Javascript
You might like
创建无限极分类树型结构的简单方法
2017/06/20 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
vue中$refs的用法及作用详解
2018/04/24 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
python 判断一个进程是否存在
2009/04/09 Python
初学python数组的处理代码
2011/01/04 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
python实现AES加密和解密
2019/03/27 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
超市实习总结自我鉴定
2013/09/19 职场文书
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
2014年保育员工作总结
2014/12/02 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis