全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

ES6中Symbol类型用法实例详解

本文实例讲述了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程序设计有所帮助。


# ES6  # Symbol  # 类型  # ES6中Symbol、Set和Map用法详解  # 详解ES6 Symbol 的用途  # Javascript ES6中数据类型Symbol的使用详解  # ES6新特性之Symbol类型用法分析  # ES6概念 Symbol toString()方法  # ES6概念 Symbol.keyFor()方法  # ES6初步了解原始数据类型Symbol的用法  # 注册表  # 可以利用  # 创建一个  # 是在  # 是一种  # 又是  # 中有  # 提出了  # 要在  # 可以通过  # 这类  # 带来了  # 给大家  # 但却  # 种方法  # 每次都  # 第三方  # 方法来  # 所述  # 为了防止 


相关文章: 网站制作价目表怎么做,珍爱网婚介费用多少?  制作门户网站的参考文献在哪,小说网站怎么建立?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  建站主机与服务器功能差异如何区分?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何在宝塔面板中修改默认建站目录?  如何获取PHP WAP自助建站系统源码?  网站制作新手教程,新手建设一个网站需要注意些什么?  宝塔建站后网页无法访问如何解决?  建站之星如何防范黑客攻击与数据泄露?  如何挑选最适合建站的高性能VPS主机?  北京网站制作网页,网站升级改版需要多久?  如何通过宝塔面板实现本地网站访问?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  建站之星客服服务时间及联系方式如何?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何用5美元大硬盘VPS安全高效搭建个人网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何在Windows 2008云服务器安全搭建网站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  建站之星备案流程有哪些注意事项?  如何高效利用亚马逊云主机搭建企业网站?  如何在Golang中使用replace替换模块_指定本地或远程路径  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  ,怎么在广州志愿者网站注册?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  如何通过虚拟机搭建网站?详细步骤解析  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  导航网站建站方案与优化指南:一站式高效搭建技巧解析  浅析上传头像示例及其注意事项  建站之星好吗?新手能否轻松上手建站?  定制建站价位费用解析与套餐推荐全攻略  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  建站之星3.0如何解决常见操作问题?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  网站制作大概多少钱一个,做一个平台网站大概多少钱?  名字制作网站免费,所有小说网站的名字?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  小建面朝正北,A点实际方位是否存在偏差?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何用PHP工具快速搭建高效网站?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  临沂网站制作企业,临沂第三中学官方网站?  济南网站制作的价格,历城一职专官方网站?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何在云主机上快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。