ES6 Symbol

概述

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

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

基本用法

Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。

let sy = Symbol("KK");

console.log(sy); // Symbol(KK)

typeof(sy); // "symbol" // 相同参数 Symbol() 返回的值不相等

let sy1 = Symbol("kk"); sy === sy1; // false

用途:

用来定义对象的唯一属性名可以避免实例自定义的属性或方法覆盖原型上的属性或方法

表示常量,可以保证这一组常量的值都不相等

使用场景

作为属性名

用法

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

let sy = Symbol("key1");

// 写法1

let syObject = {};

syObject[sy] = "kk";

console.log(syObject); // {Symbol(key1): "kk"}

// 写法2

let syObject = { [sy]: "kk" };

console.log(syObject); // {Symbol(key1): "kk"}

// 写法3

let syObject = {};

Object.defineProperty(syObject, sy, {value: "kk"});

console.log(syObject); // {Symbol(key1): "kk"}

Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 sy 属性,而不是 Symbol 值 sy 属性。

let syObject = {};

syObject[sy] = "kk";

syObject[sy]; // "kk" syObject.sy; // undefined

注意点

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

let syObject = {};

syObject[sy] = "kk";

console.log(syObject);

for (let i in syObject) {

console.log(i);

} // 无输出

Object.keys(syObject); // []

Object.getOwnPropertySymbols(syObject); // [Symbol(key1)]

Reflect.ownKeys(syObject); // [Symbol(key1)]

定义常量

在 ES5 使用字符串表示常量。可以保证这一组常量的值都不相等

Symbol.for()

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

let yellow = Symbol("Yellow");

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

yellow === yellow1; // false

let yellow2 = Symbol.for("Yellow");

yellow1 === yellow2; // true

Symbol.keyFor()

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

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

Symbol.keyFor(yellow1); // "Yellow"

 

特性总结

  1. Symbol 值通过 Symbol 函数生成,使用 typeof,结果为 "symbol"
  2. Symbol 函数前不能使用 new 命令,否则会报错
  3. instanceof 的结果为 false
  4. Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述
  5. 如果 Symbol 的参数是一个对象,就会调用该对象的 toString 方法,将其转为字符串
  6. Symbol 函数的参数只是表示对当前 Symbol 值的描述,相同参数的 Symbol 函数的返回值是不相等的
  7. Symbol 值不能与其他类型的值进行运算,会报错。
  8. Symbol 值可以显式转为字符串。
  9. Symbol 值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。
  10. Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名。
  11. 如果我们希望使用同一个 Symbol 值,可以使用 Symbol.for。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
  12. Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key。



作者:原型设计
链接:https://www.jianshu.com/p/ef93ac41b511
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值