Symbols对象 JavaScript的第七种原始类型

以前的数据类型:

Undefined 未定义

Null 空值

Boolean 布尔类型

Number 数字类型

String 字符串类型

Object 对象类型

前五种数据类型是有限的。Object对象类型是无限的。symbol是程序创建并且可以用作属性键的值,并且他能避免命名冲突的风险。

var mySymbol = Symbol();//它的值与其它的值完全不相等

字符串或者数字可以作为属性的键,Symbol也可以,他不等同于任何字符串,因而这个一Symbol为键的属性可以保证不与其他属性产生任何冲突。

        var mySymbol = Symbol();//它的创建并没有new关键字
var obj = {};
obj[mySymbol] = "assassin";
console.log(obj[mySymbol]);//assassin 保证不会冲突

以symbol为键的属性与数组元素类似,访问时必须使用方括号访问这些属性。

typeof Symbol();//"symbol" symbol与其他对象不完全相像

symbol创建后就不可以变更,不能为其设置属性,它们可以使用做属性名称,这些性质一字符串类似。每一个symbol都是独一无二的不与其他的symbol等同,即使二者有相同的描述也不相等。

symbol注意:symbol不能自动转换成字符串,不能与字符串拼接,会得到TypeError。通过String(mySymbol)或者mySymbol.toString()可以转换成字符串。

获取symbol的三种方法

1.调用Symbol();这种方法每次的调用都会返回一个新的唯一的symbol

2.调用Symbol.for(string);这种方法会访问symbol注册表,其中存储了已经存在的一些列symbol。这种与Symbol()定义的独立mySymbol不同,第二种方法中的mySymbol是注册表中的,是共享的,如果你好多次调用Symbol.for("cat");都会返回相同的mySymbol,注册表非常有用,在多个web页面中或者同一个web页面中的多个模块经常需要共享一个mySymbol;

       var obj2 = {};
var mySymbol1 = Symbol.for("aaa");
var mySymbol2 = Symbol.for("aaa");
console.log(obj2[ mySymbol1 ]+" "+obj2[ mySymbol2 ]);//undefined undefined
console.log(obj2[ mySymbol1 ] == obj2[ mySymbol2 ]);//true

3.使用标准定义的symbol,如:Symbol.iterator.

symbol在es6中的应用:

1.使用instanceof可扩展。表达式object instanceof constructor被指定为构造函数的一个方法:constructor[Symbol.hasInstance](object);这意味着它是可扩展的。

2.消除新特性和旧代码之间的冲突。添加某些ES6数组方法会破坏现有的Web网站.其他Web标准有相同的问题:想浏览器中添加新方法会破会原有的网站。问题主要由动态作用域引起,ES6引入一个特殊symbol(Symbol.unscopables),Web标准用这个symbol来阻止某些方法加入到动态作用域中。

3.支持新的字符串匹配类型。es5中str.match(myObject)会尝试将其转换成正则表达式对象(RegExp)。es6中他会检查myObject是否有一个myObject[Symbol.match](str)方法。现在的库可以提供自定义的字符串解析类。所有支持RegExp对象的环境都可以正常运行。

   var mySymbol = Symbol();
var obj = {};
obj[mySymbol] = "assassin";
console.log(obj[mySymbol]); var obj2 = {};
var mySymbol1 = Symbol.for("aaa");
var mySymbol2 = Symbol.for("aaa");
console.log(obj2[ mySymbol1 ]+" "+obj2[ mySymbol2 ]);//undefined undefined
console.log(obj2[ mySymbol1 ] == obj2[ mySymbol2 ]);//true

最新文章

  1. ListView之多种类型Item
  2. win tomcat
  3. Spring IOC/DI和AOP原理
  4. PHP大文件存储示例,各种文件分割和合并(二进制分割与合并)
  5. 1.3 基础知识——GP2.1 方针(Policy)
  6. 讲解Python中的递归函数
  7. Libgdx 开发指南(1) 应用框架
  8. 递推DP URAL 1119 Metro
  9. 【MySQL】使用mysqlbinlog回滚
  10. poj 1552 Doubles
  11. 剑指Offer17 二叉树的镜像
  12. C#基础练习(时间的三连击)
  13. SpringMVC——从HelloWorld
  14. ref与out之间的区别整理 摘自与望楼http://blog.csdn.net/xiaoning8201/article/details/6893154
  15. LeetCode 40. Combination Sum II (组合的和之二)
  16. HDU 6113 度度熊的01世界
  17. 解决IDEA创建多模块项目找不到创建class类的问题
  18. js--深拷贝与浅拷贝
  19. Android基础知识(一)
  20. C++11 类型后置语法

热门文章

  1. C++中inline函数
  2. vue下载模板、导出excle
  3. 由于webpack-cli版本问题造成的错误
  4. [Bug]Python3.x AttributeError: libtest.so: undefined symbol: fact
  5. webStrom的破解以及汉化
  6. CSU 1374 Restore Calculation 数位DP
  7. [React] Implement a Higher Order Component with Render Props
  8. Servlet具体解释
  9. atitit.js 与c# java交互html5化的原理与总结.doc
  10. QThread 爬坑之旅(三种办法解决QObject: Cannot create children for a parent that is in a different thread)