// es6引入了一种新的数据类型,symbol,表示独一无二的值,它是JavaScript第七种数据类型
// 前六种分别为:undefined,null,boolean,string,number,object,
// Symbol值通过Symbol函数生成
// 也就是说对象的属性名现在可以有两种数据类型第一种是原来就有的字符串,第二种新增的symbol类型
let s = Symbol();
console.log(typeof s) // symbol
// 注意:symbol函数前不能使用new命令,否则会报错,这是因为生成symbol是一个原始类型的值不是对象,也就是说symbol值,
// 不是对象,所以不能添加属性.基本上上它是一个类似于字符串的数据类型
// Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时比较容易区分
var s1 = Symbol('foo');
var s2 = Symbol('bar');
console.log(s1,s2) // Symbol(foo) Symbol(bar)
// 注意:Symbol函数的参数指标是对当前symbol值的描述,因此相同参数的symbol函数的返回值是不相等的,
var s3 = Symbol();
var s4 = Symbol();
s3 === s4 // false
// Symbol值可以显式转为字符串
var sym = Symbol('my Symbol');
console.log(String(sym)); // 'Symbol(my Symbol)'
// 也可以转换为布尔值
var s5 = Symbol();
Boolean(s5); // true
// 作为属性名的 Symbol
var s6 = Symbol();
var a = {};
//第一种写法
a[s6] = 'hello';
//第二种写法
var a1 = {
[s6]:'hello'
}
//第三种写法
var a2 = {};
Object.defineProperty(a2,s6,{value:'hello'});
注意symbol作为属性名时不能使用点运算符
var a3 = {}
a3.s6 = 'hello'; // ×
// 属性名的遍历
// Symbol作为属性名,该属性不会出现在for...in,for...of循环中,也不会被Object.keys(),Object.getOwnPropertyNames()返回
// 但他也不是私有属性,Object.getOwnPropertySymbols()方法可以获取指定对象的所有symbol属性名
// 新的API Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和Symbol键名
// 内置的Symbol值
//除了定义自己使用的symbo值,es6还提供了11个内置的symbol值,指向语言内部使用的方法
// Symbol.iterator