资讯专栏INFORMATION COLUMN

[javascript]symbol是什么?

Rindia / 2031人阅读

摘要:是中一种新的数据类型。或许某天遇到什么需求可以派上用场。它是唯一的每个实例都是唯一的。对象属性正因为他是唯一的。他主要是可以通过它的唯一性代替常量。原来情况可以改用或者等,类似的情况。

symbol

symbol是ES6中一种新的数据类型。平时很少会用到,今天特意了解一下。或许某天遇到什么需求可以派上用场。

首先它是一种新的数据类型

使用方法

</>复制代码

  1. let e = Symbol()

这样便创建了一个Symbol实例。如果我们用typeof来检查它,会返回symbol,一个新的类型。

</>复制代码

  1. typeof e //symbol
它是唯一的

每个symbol实例都是唯一的。

</>复制代码

  1. let s1 = Symbol()
  2. let s2 = Symbol("another symbol")
  3. let s3 = Symbol("another symbol")
  4. s1 === s2 // false
  5. s2 === s3 // false
对象属性

正因为他是唯一的。我们可以把他做对象的特定属性。

</>复制代码

  1. const PROP_NAME = Symbol()
  2. const PROP_AGE = Symbol()
  3. let obj = {
  4. [PROP_NAME]: "属性"
  5. [PROP_AGE] = 18
  6. }
  7. obj[PROP_NAME] // "属性"
  8. obj[PROP_AGE] // 18
对象中的Symbol不能普通方法列举

Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,它未被包含在对象自身的属性名集合(property names)之中。

</>复制代码

  1. let obj = {
  2. [Symbol("name")]: "name",
  3. age: 18,
  4. title: "Engineer"
  5. }
  6. Object.keys(obj) // ["age", "title"]
  7. for (let p in obj) {
  8. console.log(p) // 分别会输出:"age""title"
  9. }
  10. Object.getOwnPropertyNames(obj) // ["age", "title"]

所以可以用Symbol存放一些不需要对外操作的属性。

枚举Symbol

Symbol有自己特定的枚举方法。

</>复制代码

  1. // 使用Object的API
  2. Object.getOwnPropertySymbols(obj) // [Symbol(name)]
  3. // 使用新增的反射API
  4. Reflect.ownKeys(obj) // [Symbol(name), "age", "title"]
场景

按他的特性来说能我遇到过需要Symbol用场景确实不是很多。他主要是可以通过它的唯一性代替常量。

</>复制代码

  1. // 原来情况
  2. export const FECTH_PROJECT_ROOT = "fetchProjectRoot"
  3. export const DELETE_FILE = "deleteFile"
  4. let obj={
  5. [FECTH_PROJECT_ROOT]:{
  6. },
  7. [DELETE_FILE]:{
  8. }
  9. }

可以改用Symbol

</>复制代码

  1. export const FECTH_PROJECT_ROOT = Symbol();
  2. export const DELETE_FILE = Symbol();
  3. let obj={
  4. [FECTH_PROJECT_ROOT]:{
  5. },
  6. [DELETE_FILE]:{
  7. }
  8. }

或者switch等,类似的情况。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105581.html

相关文章

  • 重学前端学习笔记(六)--JavaScript类型有哪些你不知道的细节?

    摘要:的码点被称为基本字符区域。关于的介绍,我准备用文档阮一峰来做一些介绍,具体的可以参考文档引入的原因的对象属性名都是字符串,这容易造成属性名的冲突。其他的一些属性可以去看文档阮一峰注意函数前不能使用命令,否则会报错。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完...

    Lsnsh 评论0 收藏0
  • 重学前端学习笔记(六)--JavaScript类型有哪些你不知道的细节?

    摘要:的码点被称为基本字符区域。关于的介绍,我准备用文档阮一峰来做一些介绍,具体的可以参考文档引入的原因的对象属性名都是字符串,这容易造成属性名的冲突。其他的一些属性可以去看文档阮一峰注意函数前不能使用命令,否则会报错。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完...

    joyvw 评论0 收藏0
  • 重学前端学习笔记(六)--JavaScript类型有哪些你不知道的细节?

    摘要:的码点被称为基本字符区域。关于的介绍,我准备用文档阮一峰来做一些介绍,具体的可以参考文档引入的原因的对象属性名都是字符串,这容易造成属性名的冲突。其他的一些属性可以去看文档阮一峰注意函数前不能使用命令,否则会报错。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完...

    zlyBear 评论0 收藏0
  • JavaScript什么要有 Symbol 类型

    摘要:也有类似的概念,它是根据传递的数据类型推断的。这个特性的名称被称为私有字段,虽然这不会使所有对象受益,但会使类实例的对象受益。警告中有一个功能会破坏代理的隐私。 showImg(https://segmentfault.com/img/bVbpL6y?w=800&h=456); Symbols 是 ES6 引入了一个新的数据类型 ,它为 JS 带来了一些好处,尤其是对象属性时。 但是,...

    lemanli 评论0 收藏0

发表评论

0条评论

Rindia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<