Symbol 和 Symbol属性

 Symbol 和 Symbol属性
       Symbol: 符号

       ESMAScript6:

          原始数据类型:字符串、数字型、布尔型、null、undefined 以及 Symbol

       创建 Symbol:
         所有原始值除了Symbol都有各自的字面量形式,例如 布尔类型的 true

        let firstName = Symbol();
        let person = {};
        person[firstName] = "song"
        console.log(person[firstName]);

        // 创建时添加一个描述信息,描述文字不可以访问
        let name = Symbol("desc info");
        console.log("desc info" in person); // false

        // Symbol的辨识方法
        console.log(typeof firstName); // symbol

        // Symbol的使用方法

        // 使用一个可计算对象字面量属性
        person = {
            [firstName] : "Apple"
        };

        // 将属性设置为可读
        Object.defineProperty(person, firstName, {writable: false});

        let lastName = Symbol("egg");

        Object.defineProperties(person, {
            [lastName] : {
                value : 'age',
                writable: false
            }
        });

        console.log(person[firstName]); // Apple
        console.log(person[lastName]);  // egg

        // Symbol共享体系  有时候希望在不同的代码中共享同一个Symbol

        // 创建可共享的Symbol
        let uid = Symbol.for("uid");

        let obj = {};
        obj[uid] = "12345";

        console.log(obj[uid]); // 12345
        console.log(uid); // Symbol(uid)

        /*
        * Symbol.for("uid") 首先会在Symbol注册表中搜索键为 uid的Symbol是否存在
        *     如果存在:
        *         直接返回已有的Symbol
        *     如果不存在:
        *         创建一个新的Symbol并使用这个键在Symbol全局注册表中注册, 随机返回创建的Symbol
        * */

        let uid2 = Symbol.for("uid");
        console.log(uid == uid2); // true
        console.log(obj[uid2]);  // 1234
        console.log(uid2);  // Symbol(uid)

        // 可以使用 Symbol.keyFor() 方法在全局注册表中检索与Symbol有关的键

        console.log(Symbol.keyFor(uid)); // 返回 uid 的键
        console.log(Symbol.keyFor(uid2)); // 返回 uid 的键
        // console.log(Symbol.keyFor(uid3)); undefined

        // Symbol与类型强制转换, 不能将Symbol强制转换成字符串和数字类型
        let str = Symbol();
        // console.log(str + ""); Cannot convert a Symbol value to a string
        console.log(typeof Symbol.for("uid")); // symbol

        // Symbol属性检索
        /*
            检索对象的所有属性名
            Object.keys()
            Object.getOwnPropertyNames()
            Object.getOwnPropertySymbols()
        */

        let lab_id = Symbol();
        let json = {
            [lab_id] : 123
        };
        let keys = Object.getOwnPropertySymbols(json);
        console.log(keys.length);
        console.log(keys[0]); // Symbol
        console.log(json[keys[0]]); // 123

 

相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页