资讯专栏INFORMATION COLUMN

[javascript]symbol是什么?

Rindia / 1831人阅读

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

symbol

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

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

使用方法

let e = Symbol()

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

typeof e //symbol
它是唯一的

每个symbol实例都是唯一的。

let s1 = Symbol()
let s2 = Symbol("another symbol")
let s3 = Symbol("another symbol")

s1 === s2 // false
s2 === s3 // false
对象属性

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

const PROP_NAME = Symbol()
const PROP_AGE = Symbol()

let obj = {
  [PROP_NAME]: "属性"
  [PROP_AGE] = 18
}

obj[PROP_NAME] // "属性"
obj[PROP_AGE] // 18
对象中的Symbol不能普通方法列举

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

let obj = {
   [Symbol("name")]: "name",
   age: 18,
   title: "Engineer"
}

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

for (let p in obj) {
   console.log(p)   // 分别会输出:"age" 和 "title"
}

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

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

枚举Symbol

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

// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]

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

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

// 原来情况
export const FECTH_PROJECT_ROOT = "fetchProjectRoot"
export const DELETE_FILE = "deleteFile"

let obj={
    [FECTH_PROJECT_ROOT]:{

    },
    [DELETE_FILE]:{

    }
}

可以改用Symbol

export const FECTH_PROJECT_ROOT = Symbol();
export const DELETE_FILE = Symbol();

let obj={
    [FECTH_PROJECT_ROOT]:{

    },
    [DELETE_FILE]:{

    }
}

或者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元查看
<