JaneChelle | Blog JaneChelle | Blog

执着于理想,纯粹于当下

目录
Symbol
/      

Symbol

一、概念

  1. 前言:ES5 中对象的属性名都是字符串,容易造成重名,污染环境

  2. 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']