javascriptsymbol是什么

120次阅读

共计 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 等,类似的情况。

正文完
 0