ES6新特性:增加新类型:Symbol
ES6新增了一种数据类型:Symbol,Symbol是用来定义对象的唯一属性名的不二之选;
Symbol如何使用呢, Symbol不是一个构造函数哦, 如果用new Symbol的话, 会报错的:
运行下面代码
var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");
console.log(sym1, sym2, sym3) //输出Symbol() Symbol(foo) Symbol(foo)
连自己都不等于自己:
//用同样的参数创建两次, 也是不相等的:
Symbol("foo") === Symbol("foo"); //输出:false
作为属性名的Symbol;使用Symbol给对象添加唯一的属性, Symbol也能作为对象的函数名;
let obj = {};
let sAttr0 = Symbol("hehe");
let sAttr1 = Symbol("meme");
obj[sAttr1] = 1;
console.log(obj[sAttr1]);
obj[sAttr0] = () => {
return ++obj[sAttr0];;
};
我们可以用typeof判断某一个变量类型为Symbol类型:
运行下面代码
typeof Symbol() === 'symbol' //输出:true
typeof Symbol('foo') === 'symbol' //输出: true
typeof Symbol.iterator === 'symbol' //输出 : true
如果我们不知道Symbol的实例名字是什么,我们怎么获取到Symbol值的呢, Symbol无法被for in , for of循环,以及Object.keys, Object.values 等都无法遍历到Symbol的属性; Object下给我们提供了一个getOwnPropertySymbols;
let sym0 = Symbol("o_o?");
let obj = {
[sym0] : "heheda"
}
for( let prop of Object.getOwnPropertySymbols(obj) ) {
//prop就是Symbol的名字
console.log( obj[prop] ); //输出:heheda
};