共计 1218 个字符,预计需要花费 4 分钟才能阅读完成。
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 等,类似的情况。
正文完
发表至: javascript
2019-07-12