Ecmascript-6
ES6 发布时间2015-6月,又称ECMAScript 2015
http://kangax.github.io/compat-table/es6/
概述
对象的属性名都是字符串,容易造成属性冲突; 而ES6引入Symbol的原因就是为了从根本上防止属性名的冲突
原始数据类型
Undefined
Null
Boolean
String
Number
Object
新的原始数据类型 Symbol
Symbol的值是通过Symbol函数生成的,这就是说,对象的属性名现在又两种类型,一种是原来的字符串,另一种就是Symbol类型;凡是属性名是属于symbol类型的,都是独一无二的;
可以保证不会与其他的属性名产生冲突
var s = Symbol('params'); //params 参数可以生成一个对Symbol的描述值; 方便控制台打印的时候显示
typeof s // "Symbol"
params只是一个描述字段;相同的描述生成的Symbol值还是不同的
作为属性名的Symbol
var myS = Symbol('test');
var a = {};
a[myS] = 'hello world';
var a = {
[myS]: 'Hello world'
};
var a = {};
Object.defineProperty( a, myS, {value: 'Hello World!'});
a[mySymbol] //
- 不能通过 . 操作符操作Symbol属性
- 由于Symbol不是字符串类型,为了与字符串属性进行区分;通过添加[]方括号的方式来处理
- 应用在switch语句中可确保常量值的唯一
实例:消除魔术字符串
- 魔术字符串-代码中多次出现,与代码形成了强耦合的某个具体字符串和数值
- 定义一个公共的量来处理
属性名的遍历
- 不会出现在for...in/for...of的循环中也不会被Object.keys()/Object.getOwnPropertyNames()返回但是他也不是私有属性
- 有一个Object.getOwnPropertySymbols方法。可以获取指定对象的所有Symbol属性名
- 以上特性,可以使其定义一些非私有的内部调用的方法
Symbol.for(), Symbol.keyFor()
- Symbol.for()
- 以参数去查找,如果有,则返回这个Symbol值,如果没有,重新建一个Symbol值并返回
- 但是需要两者都是调用Symbol.for() 才会相等
var s = Symbol('test2');
var ss = Symbol.for('test2');
ss == s //false
var s = Symbol.for('test2');
var ss = Symbol.for('test2');
ss == s //true
- Symbol.keyFor() 返回已经登记过[Symbol.for('xx')]的symbol的key值;若未登记则为undefined
var s = Symbol.for('test');
var ss = Symbol.keyFor(s);
console.info(ss) // test
内置的Symbol的属性
- [Symbol.hasInstance] 判断该对象是否为某个构造函数的实例
- [Symbol.isConcatSpreadable] 表示对象在使用Array.prototype.concat()时,是否可以展开
- [Symbol.species] 指向一个方法,该对象作为构造函数创造实例时,会调用这个方法
- [Symbol.match] 对象的Symbol.match属性,指向一个函数。当执行str.match(obj)是,如果改属性存在,会调用这个函数
- [Symbol.replace] 指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值
- [Symbol.search] 指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值
- [Symbol.split] 指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值
- [Symbol.iterator] 即该对象进行for...of循环时,会调用这个方 法,返回该对象的默认遍历器
- [Symbol.toPrimitive] 对象的一个属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该方法对象的原始类型值
- [Symbol.toStringTag] 可以用来定制指向Object.prototype.toString方法时,如果这个属性存在;它的返回值会出现在toString方法返回的字符串之中。表示对象的类型
- [Symbol.toStringTag] 可以用来定制[object Object/Array 后面的Object/Array