Symbol
# Symbol
通过 Symbol 函数来生成符号
符号的初衷是为了给对象设置私有变量
特征:
- 没有字面量
- 使用 typeof 得到的类型是 symbol
- 每次调用 Symbol 函数得到的符号永不相等,无论是否用同一个名称生成。
- 符号可以作为对象的属性名,称之为符号属性
- 可以让这些属性无法通过常规的方式被外界访问
- 符号属性不能枚举,for-in 循环无法读取到该属性,Object.keys 方法也无法得到符号属性。
- Object.getOwnPropertyNames 可以得到所有无法枚举的属性,但是仍然无法使用。
- ES6 新增 Object.getOwnPropertySymbol 方法,可以读取到符号
- 符号不能被隐式转换为数字,但是可以通过String 转换为字符串。
# 共享符号
Symbol.for(name) 如果 name 相同则返回相同的 Symbol。
# 知名符号
1、intanceof
实际上调用的是 F[Symbol.hasIntance](obj)
2、concat
如果参数中存在数组,则会将数组分隔然后拼接,
Symbol.isConcatSpreadAble
如果将他设置为 true 则会分隔,false 则不变。
3、Symbol.toPrimitive
对象在转换时会先调用 valueOf、toString。现在是调用这个 Symbol.toPrimitive 这个函数来转换。
4、Symbol.toStringTag
会影响原生的 toString 方法。[Object Object] 可以改变。