es6之(Symbol)用法

402 阅读2分钟

Symbol代表创建后独一无二且不可变的数据类型,主要是为了解决可能出现的全局变量冲突的问题。

  1. Symbol 函数前不能使用 new 命令,否则会报错。
  2. Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
  3. Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。
  4. Object.getOwnPropertySymbols 方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
  5. Symbol.for 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
  6. Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key。
        // Symbol用于防止属性名冲突而产生的 比如向第三方对象中添加属性时  
        // Symbol的值是唯一的 独一味二的不会重复 
        let hd = Symbol();
        let edu = Symbol();
        console.log(hd);        //symbol 
        console.log(hd == deu)  //false 
        //Symbol 不可以添加属性 
        let hd = Symbol(); 
        hd.name = "常东东";
        console.log(hd.name);   //undifined 
        //描述参数.字符串用于描述Symbol 方便再控制台分辨Symbol
        let hd = Symbol("is 东东");
        let edu = Symbol("这里测试一下");
        console.log(hd);                 //Symbol(is 东东)
        console.log(edu.toString());     //Symbol(这里测试一下)
        //对象属性 
        //Symbol 是独一无二的 所以可以保证对象属性的唯一 
        //Symbol 声明和访问使用 [](变量)形式操作  不能使用 . 语法因为 .语法是操作字符串属性的。
        //错误写法 会将symbol 当成字符串symbol处理
        let symbol = Symbol("老王");
        let obj = {
            symbol: "hdcms.com"
        };
        console.log(obj);
        //正确写法是以[] 变量形式声明和访问
        let symbol = Symbol("锤子");
        let obj = {
             [symbol]: "houdunren.com"
        };
        console.log(obj[symbol]); //houdunren.com