前言:ES5 中对象的属性名都是字符串,容易造成重名,污染环境
Symbol
2.1概念:ES6 中的添加了一种原始数据类型 symbol (已有的原始数据类型:
String, Number, boolean, null, undefined, 对象)
2.1特点:
1. Symbol 属性值对应的值是唯一的,解决命名冲突的问题
2. Symbol 值不能与其他数据类型进行计算,包括同字符串拼接
3. for in,for of 遍历时不会遍历 symbol 属性
2.2使用:
1.调用 Symbol 函数得到 symbol 值
2.传参标识
3.内置 Symbol 值
除了定义自己使用的 SymboL 值以外,ES6 还提供了 11 个内置的 Symbol
值,指向语言内部使用的方法。
Symbol. iterator
对象的 Symbol. iterator 属性,指向该对象的默认通历器方法(后讲)
```
let symbol = Symbol();
let obj = {};
obj[symbol] = 'hello';
console.log(obj)
let symbol1 = Symbol( 'one');
let symbol2 = Symbol( 'two');
console. log(symbol1);// Symbol( 'one ')
console. log(symbol2);// Symbol( 'two ')
```
3.for in, for of 不能遍历 symboL 属性
```
let symbol = Symbol();
let obj = {username: 'kobe', age: 39};
obj[symbol] = 'hello';
console.log(obj)
// for in,for of不能遍历symboL属性
for (let i in obj){
console.log(i);
}
```
4.难道我们就没有办法获取 Symbol 方式定义的对象属性了吗?私有属性并不是绝对
的,我们可以通过一些 API 函数进行获取,
// 使用Object的API
console.log(Object.getOwnPropertySymbols(obj));
// [Symbol(pwd)]
// 使用新增的反射API
console.log(Reflect.ownKeys(obj));
// [Symbol(pwd), 'age', 'title']