ES6 Symbol
表示一个独一无二的值
const sym = Symbol()
不需要new
- unique
1
2
3const s1 = Symbol('tan')
const s2 = Symbol('tan')
console.log(s1 === s2); // error - 不能使用运算符
1
2
3const s3 = Symbol(100)
console.log(s3 + 200); // TS2365: Operator '+' cannot be applied to types 'unique symbol' and 'number'.
// 不能使用运算符 或 + 拼接 - toString()
1
console.log(s3.toString() + 200); // toString() + 拼接 "Symbol(100)200"
作为对象的属性
1 | let s4 = Symbol('name') |
不能通过对象形式访问 Symbol 类型的属性:
obj.name || obj.s4
只能
obj[s4]
访问遍历:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17let s4 = Symbol('name')
const obj = {
[s4]: 's4',
a: 'aaa',
b: '1231'
}
for (let key in obj) {
console.log(key); // a b Symbol 类型不会被遍历出来
}
console.log(Object.keys(obj)) // ['a', 'b'] 同样不会
console.log(Object.getOwnPropertyNames(obj)) // ['a', 'b'] 同样不会
console.log(JSON.stringify(obj)) // {"a":"aaa","b":"1231"} 同样不会
console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(name)] 只返回 symbol 类型的属性名 key
console.log(Reflect.ownKeys(obj)) // ['a', 'b', Symbol(name)] 返回所有
静态方法
for()
返回一个 Symbol 类型的值
1 | const s7 = Symbol.for('s5') |
keyFor()
- 返回一个 Symbol 类型的值的 索引
- 只接受 Symbol.for() 方法创建的值
- 对于 Symbol() 则返回 undefined
1 | let s4 = Symbol('name') |
内置属性
Symbol.hasInstance
返回使用instanceof
判断symbol
类型的原始对象Symbol.isConcatSpreadable