美文网首页
ES6 symbol类型的理解和应用场景归纳

ES6 symbol类型的理解和应用场景归纳

作者: 南山码僧 | 来源:发表于2019-12-16 12:38 被阅读0次

    概述

    symbol是ES6新引入的一种基础数据类型,该类型具有静态属性和静态方法,因为作为构造函数来它是不完整的,所以它不支持“new Symbol()”语法。

    ① Symbol()

    意义

    每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标志符。这是该数据类型仅有的目的。

    语法

    Symbol([description])

    参数

    description 可选,字符串类型。对symbol的描述,可用于调试但不是访问symbol本身。

    用例

    let sym1 = Symbol("foo");

    let sym2 = Symbol("foo");

    sym1 === sym2; // false

    let sym = new Symbol(); // TypeError


    ② Symbol.for()

    意义

    全局共享的Symbol

    它接受一个字符串作为参数,然后全局环境中搜索是否有以该参数注册的Symbol值。如果有,就返回这个Symbol值。没有就创建并返回一个以该字符串作为名称的Symbol值。

    语法

    Symbol.for(key);

    参数

    key 一个字符串,作为symbol注册表中与某symbol关键的键(同时也会作为该symbol的描述)。

    用例

    let sym1 = Symbol.for("foo");

    let sym2 = Symbol.for("foo");

    sym1 === sym2; // true

    ③ Symbol.keyFor()

    意义

    在全局注册表中搜索查找改symbol,如果有返回该symbol的key值,形式为string。如果没有返回undefined。

    语法

    Symbol.keyFor(sym);

    参数

    sym必选参数,存储在symbol注册表中的某个symbol。

    用例

    let sym= Symbol.for("foo");

    console.log(Symbol.keyFor(sym)); // foo

    应用场景

    1:当做对象属性key来使用,但是注意用例中4中方式是无法获取到以Symbol为key的属性的。

    用例

    let s_name= Symbol("name");

    let obj= {

        [s_name]: "lle",

        age: 18,

        title: "Engineer"

    };

    console.log(Object.keys(obj)); // ["age", "title"]

    for(let key in obj) {

        console.log(key); // 输出age, title

    }

    console.log(Object.getOwnPropertyNames(obj)); // ["age", "title"]

    JSON.stringify(obj);  // {"age":18,"title":"Engineer"}

    以上这些常规的方式都是无法获取到的

    如果要获取可以用个以下三种方式

    obj[s_name];// lle

    Object.getOwnPropertySymbols(obj); // [Symbol(name)]

    Reflect.ownKeys(obj); // ["age", "title", Symbol(name)]

    2: 使用Symbol来替代常量使用

    用例

    const NAME = Symbol();

    const Age = Symbol()

    相关文章

      网友评论

          本文标题:ES6 symbol类型的理解和应用场景归纳

          本文链接:https://www.haomeiwen.com/subject/pkbrnctx.html