ES6
新增的一种数据类型,最大的作用是,数据的 唯一性
。
定义局部变量
const a1 = Symbol('a')
const a2 = Symbol('a')
console.log(a1); // Symbol(a)
console.log(a2); // Symbol(a)
console.log(a1 === a2) // false
console.log(a1 == a2) // false
console.log(typeof a1) // symbol
// 不论哪种相等比较,都不相同
定义全局变量
keyFor
用来描述 全局Symbol
注册表中的key
,用来查找symbol
变量。for
用来查找某个symbol
值得注册key
。当注册key
已经有 symbol 值时,不会再创建新值,而是直接返回当前值。 ```javascript const s1 = Symbol.for(‘s1’) const symKey = Symbol.keyFor(s1) console.log(symKey); // s1
if (Symbol.for(symKey)) { console.log(‘has s1’); } // has s1
<a name="JlrKo"></a>
## 作为对象属性
某些时候,对象的属性不希望暴露。就可以用 `symbol`。
- `symbol `作为对象属性,不能被普通 `for`循环遍历
- 需要用特殊方法 `getOwnPropertySymbols`、`Reflect.ownKeys` 等,获取 symbol 属性
```javascript
const a = Symbol('a')
const b = Symbol('b')
const obj = {}
obj[a] = 'a'
obj[b] = 'b'
try {
console.log('for of ----------->')
for (let k of obj) {
console.log(k, obj[k])
}
} catch (err) {
console.log(err)
}
// for of ----------->
// symbol.html:28 TypeError: obj is not iterable
const obj = {}
const a = Symbol('a')
const b = Symbol('b')
obj[a] = 'a'
obj[b] = 'b'
// 获取不到
console.log(Object.keys(obj)); // []
// 通过内置方法获取
console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(a), Symbol(b)]
// 通过 Reflect 拦截获取
console.log(Reflect.ownKeys(obj)) // [Symbol(a), Symbol(b)]
使用场景
😕一言难尽,适用场景并不多。凡是需要确保数据值唯一的地方,可以尝试使用 Symbol