Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Chrome38正式引入Symbol

  之前说Firefox的"@@iterator"属性时就已经用到了Symbol的概念,只是当时Firefox并没有真正引入Symbol这个东西,而是使用一个特殊字符来实现。虽然V8中早就实现了Symbol,但一直没在稳定版中放出来,直到现在最新的稳定版——Chrome38
  在ES6之前,JavaScript对象的键只允许使用字符串(也许数组的键会被认为是数字,实际上规范中还是字符串,不过在优化上会被以数字的形式实现),Symbol就是为了突破这个概念而存在的。
  Symbol是一种新的数据类型,它的值具有新的typeof结果(基于typeof判断的程序以后可能需要考虑Symbol类型了)

  Symbol值可以没有字面量,通过调用全局的Symbol函数得到,而且通过调用Symbol函数得到的Symbol值永远是不同的。在这方面,它具有对象的性质。

  但Symbol值更具有原始类型的性质,它本身不能像对象一样储存数据,但可以作为对象的键名,而且这个键名是隐藏的,无法通过其它渠道从对象上获取。
<script>
var symbol=Symbol();
symbol.xxx="xxx";
console.log(symbol.xxx); //undefined
var object={};
object[symbol]="yyy";
console.log(object[symbol]); //"yyy"
console.log(Object.getOwnPropertyNames(object)); //[]
</script>
  有了Symbol的概念,我们就可以在对象中藏一些奇怪的东西,让这些东西只能在封装的内部使用,对外部不开放。实际上Firefox的"@@iterator"属性本意就是把一个Generator藏在对象中,在需要迭代时取出调用,并且这个属性的存在不对对象本身造成任何副作用。ES6的Set和Map也完全可以通过Symbol来实现。
  总之Symbol是我很喜欢的一个特性,它绝对是未来封装的神器!既然Chrome都支持了是不是该庆祝一下呢?
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^