Symbol有什么用?
1.防止变量名起冲突
const s1 = Symbol()
const s2 = Symbol()
console.log(s1 === s2); //false
2.避免魔术字符串
什么是魔术字符串?
在代码中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。
function getFn(val) {
switch (val) {
case 'magicString':
return ['this', 'is', 'magicString']
default:
return []
}
}
let data = getFn('magicString')
// 'magicString' 就是魔术字符串
风格良好的代码,应该尽量消除魔术字符串,改成含义清晰的变量代替。
3. 定义不重复的常量
4. symbol
作为键名时,不被常规方法遍历出来,因此可以给对象定义非私有,但只用于内部使用的方法和属性
如何使用Symbol?
description
// 基本定义
const s1 = Symbol()
const s2 = Symbol('aaa')
console.log(s1) // Symbol()
console.log(s2) // Symbol(aaa)
// 也可以加一个description 只获取里面描述的参数
console.log(s2.description) // aaa
symbbol作为key
// 写法1
const s1 = Symbol()
const s2 = Symbol('ccc')
const s3 = Symbol('aaa')
const obj = {
[s1]:'abc',
[s2]:'cba'
}
// 写法2
obj[s3] = 'bca'
效果
怎么样获取到这些Symbol
类型的参数呢?
通过Object.getOwnPropertySymbols()
,作用:方法返回一个给定对象自身的所有 Symbol 属性的数组
// Object.getOwnPropertySymbols获取symbol的所有key
console.log(Object.getOwnPropertySymbols(obj));
// [Symbol(), Symbol(ccc), Symbol(aaa)]
// 通过key来获取obj里的参数
const arr = Object.getOwnPropertySymbols(obj)
console.log(obj[arr[0]]); // abc
Symbol.for()
Symbol.for(key)
方法会根据给定的键 key,来从运行时的 symbol
注册表中找到对应的symbol
,如果找到了,则返回它,否则,新建一个与该键关联的symbol
,并放入全局 symbol
注册表中。
语法
Symbol.for(
key
)
参数
一个字符串,作为 symbol 注册表中与某 symbol 关联的键(同时也会作为该 symbol 的描述)。
如何创建一个全等的Symbol
// 这样能创造两个全等的symbol
const sa = Symbol.for('aaa')
const sb = Symbol.for('aaa')
console.log(sa === sb); //true
//Symbol.keyFor(sym) 方法用来获取全局symbol 注册表中与某个 symbol 关联的键。
console.log(Symbol.keyFor(sa )); //aaa
//以下不是保存在全局Symbol注册表中的
var localSym = Symbol(); // 因为没有描述symbol
Symbol.keyFor(localSym); // undefined,