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下IE与Firefox下的差异兼容写法总结
Jun 18 Javascript
javaScript实现浮点数转十六进制字符
Oct 29 Javascript
JS Loading功能的简单实现
Nov 29 Javascript
JS获取select的value和text值的简单实例
Feb 26 Javascript
微信小程序动态的加载数据实例代码
Apr 14 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
May 26 Javascript
react系列从零开始_简单谈谈react
Jul 06 Javascript
JavaScript监听手机物理返回键的两种解决方法
Aug 14 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
Nov 17 Javascript
详解nvm管理多版本node踩坑
Jul 26 Javascript
如何在JavaScript中创建具有多个空格的字符串?
Feb 23 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
Apr 04 jQuery
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
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
php实现分页显示
2015/11/03 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
php实现websocket实时消息推送
2018/03/30 PHP
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
微信小程序实现城市列表选择
2018/06/05 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
基于python的Tkinter编写登陆注册界面
2017/06/30 Python
Django中多种重定向方法使用详解
2019/07/17 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
python中xlrd模块的使用详解
2021/02/01 Python
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
Java程序员常见面试题
2015/07/16 面试题
行政管理专业求职信
2014/07/06 职场文书
车间质检员岗位职责
2015/04/08 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
工作调动申请报告
2015/05/18 职场文书
元旦晚会开场白
2015/05/29 职场文书
社区低保工作总结2015
2015/07/23 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS