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

概述

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类型的理解和应用场景归纳)