ES6 — Symbol

1、概述

ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。

ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。

2、基本用法

let a = Symbol("kk");
console.log(a);//Symbol(kk)
console.log(typeof(a));//symbol


let b = Symbol("kk");
console.log(a == b);//false

  

1、作为属性名:

由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。

Symbol 作为对象属性名时不能用.运算符,要用方括号

let obj = {};
let sy = Symbol("kk");
obj[sy] = 'Mike';
console.log(obj); //{ [Symbol(kk)]: 'Mike' }

  

注意点:

  Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for...in 、 for...of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。

2、定义常量

在 ES5 使用字符串表示常量。但是用字符串不能保证常量是独特的,例如两个常量的字符串值相等。但使用Symbol定义字符串常量,就不会出现两个常量的值相等的问题。

3、Symbol.for()

Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

//虽然Symbol("Yellow")生成了以Yellow作为名称的Symbol值,但是不会登记在全局环境中供搜索。所以Symbol.for("Yellow")会生成新的Symbol值,yellow === yellow1就为false。
let yellow = Symbol("Yellow");
let yellow1 = Symbol.for("Yellow");
yellow === yellow1;      // false 
 
let yellow2 = Symbol.for("Yellow");
yellow1 === yellow2;     // true

  Symbol.for()Symbol()这两种写法,都会生成新的 Symbol。它们的区别是,Symbol.for()生成的Symbol会被登记在全局环境中供搜索,Symbol()生成的Symbol不会。Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值(Symbol)。比如,如果你调用Symbol.for("cat")30 次,每次都会返回同一个 Symbol 值,但是调用Symbol("cat")30 次,会返回 30 个不同的 Symbol 值。

4、Symbol.keyFor()

Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

let yellow1 = Symbol.for("Yellow");
Symbol.keyFor(yellow1);    // "Yellow"

  值得注意的是,如果用

let yellow1 = Symbol("Yellow");
Symbol.keyFor(yellow1); 
的结果就是unddfined,因为Symbol()生成的symbol不会登记在全局环境中供搜索。
posted @ 2021-09-24 17:26  小绵杨Lamb  阅读(49)  评论(0)    收藏  举报