本文实例讲述了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,类型
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。