ES6新增的一种数据类型,最大的作用是,数据的 唯一性。
定义局部变量
const a1 = Symbol('a')const a2 = Symbol('a')console.log(a1); // Symbol(a)console.log(a2); // Symbol(a)console.log(a1 === a2) // falseconsole.log(a1 == a2) // falseconsole.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 属性```javascriptconst 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
