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 相关文章推荐
jquery获取table中的某行全部td的内容方法
Mar 08 Javascript
向当前style sheet中插入一个新的style实现方法
Apr 01 Javascript
详解JavaScript函数绑定
Aug 18 Javascript
Js放到HTML文件中的哪个位置有什么区别
Aug 21 Javascript
基于Vue.js的表格分页组件
May 22 Javascript
jQuery+ajax实现实用的点赞插件代码
Jul 06 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
ES2015 Symbol 一种绝不重复的值
Dec 25 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
教你使用vue-cli快速构建的小说阅读器
May 13 Javascript
构建Vue大型应用的10个最佳实践(小结)
Nov 07 Javascript
vue监听滚动事件的方法
Dec 21 Vue.js
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/06/09 PHP
PHP文件操作实现代码分享
2011/09/01 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
php简单复制文件的方法
2016/05/09 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
JavaScript 继承详解(五)
2016/10/11 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
python基础知识小结之集合
2015/11/25 Python
Python selenium如何设置等待时间
2016/09/15 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
pandas.cut具体使用总结
2019/06/24 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
先进班级集体事迹材料
2014/01/30 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
教师四风问题整改措施
2014/09/25 职场文书
教师年度个人总结
2015/02/11 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书