ES6中Symbol类型用法实例详解

 更新时间:2017年04月06日 11:35:49   作者:布瑞泽的童话  
这篇文章主要介绍了ES6中Symbol类型用法,结合实例形式分析了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程序设计有所帮助。

相关文章

  • 微信小程序使用Vant Weapp组件库的方法步骤

    微信小程序使用Vant Weapp组件库的方法步骤

    这篇文章主要给大家介绍了关于微信小程序使用Vant Weapp组件库的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • layui数据表格 table.render 报错的解决方法

    layui数据表格 table.render 报错的解决方法

    今天小编就为大家分享一篇layui数据表格 table.render 报错的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • php实例分享之实现显示网站运行时间

    php实例分享之实现显示网站运行时间

    这篇文章主要介绍了php实现显示网站运行时间,需要的朋友可以参考下
    2014-05-05
  • JS实现可用滑块滑动的缓动图代码

    JS实现可用滑块滑动的缓动图代码

    这篇文章主要介绍了JS实现可用滑块滑动的缓动图代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • JavaScript获取表单内所有元素值的方法

    JavaScript获取表单内所有元素值的方法

    这篇文章主要介绍了JavaScript获取表单内所有元素值的方法,实例分析了javascript操作表单元素的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • js禁止页面复制功能禁用页面右键菜单示例代码

    js禁止页面复制功能禁用页面右键菜单示例代码

    禁止页面复制功能、禁用页面右键菜单等等在浏览网页时想必大家都有遇到过吧,下面为大家详细介绍下使用js是如何实现的,感兴趣的朋友可以参考下
    2013-08-08
  • Javascript中click与blur事件的顺序详析

    Javascript中click与blur事件的顺序详析

    这篇文章主要给大家介绍了关于Javascript中click与blur事件顺序的相关资料,文中介绍的非常详细,对大家学习或者使用Javascript中的click与blur事件具有一定的参考学习价值,需要的朋友可以下面来一起看看吧。
    2017-04-04
  • javascript设计模式之解释器模式详解

    javascript设计模式之解释器模式详解

    这篇文章主要介绍了javascript设计模式之解释器模式详解,当有一个语言需要解释执行,并且可以将该语言中的句子表示为一个抽象语法树的时候,可以考虑使用解释器模式,需要的朋友可以参考下
    2014-06-06
  • js批量设置样式的三种方法不推荐使用with

    js批量设置样式的三种方法不推荐使用with

    批量设置样式的三种方法:第一种使用JSON/第二种使用cssText/使用第三种with(不推荐使用),感兴趣的朋友可以参考下,希望可以帮助到你
    2013-02-02
  • JS数字精度丢失的原因及解决方案

    JS数字精度丢失的原因及解决方案

    JS的数字类型一旦数字超过限值,JS将会丢失精度,导致前后端的值出现不一致,这篇文章主要给大家介绍了关于JS数字精度丢失的原因分析及解决方法,需要的朋友可以参考下
    2022-04-04

最新评论