Symbol · TypeScript中文网 · TypeScript——JavaScript的超级 TS官网
自ECMAScript2015起,Symbol成为了一种新的原生类型,就像String和Number一样
Symbol类型的值是通过Symbol构造函数创建的
可以传递参数作为唯一标识,只支持string和number型的参数
Symbol会将我们传入的值转为字符串,以Symbol的形式输出
let s: symbol = Symbol("abc")
let n: symbol = Symbol(123)
console.log(s, n)
// Symbol(abc) Symbol(123)
Symbol的值是唯一的
因为内存地址的指针位置不同,所以是唯一的
const s1: symbol = Symbol("abc")
const s2: symbol = Symbol("abc")
console.log(s1 === s2)
// 因为内存地址的指针位置不同,所以是唯一的,所以返回false
用作对象属性的键
let sym = Symbol()
let obj = {
[sym]: "value"
}
console.log(obj[sym])
使用Symbol定义的属性,是不能通过如下方式遍历拿到的
const symbol1 = Symbol("abc")
const symbol2 = Symbol("def")
const obj1 = {
[symbol1]: "小明",
[symbol2]: "小红",
age: 19,
sex: "女"
}
// 1. for in 遍历
for (const key in obj1) {
// 注意在console打印key,是拿不到symbol的
console.log(key) // age sex
}
// 2. Object.keys 遍历
console.log(Object.keys(obj1)) // [ 'age', 'sex' ]
// 3. Object.getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj1)) // [ 'age', 'sex' ]
// 4. JSON.stringify()
console.log(JSON.stringify(obj1)) // {"age":19,"sex":"女"}
如何拿到?
// 1. 拿到具体的symbel属性,对象中有几个就会拿到几个
console.log(Object.getOwnPropertySymbols(obj1))
// [ 'age', 'sex', Symbol(abc), Symbol(def) ]
// 2. 通过拦截器,Reflect,拿到对象中所有的属性
console.log(Reflect.ownKeys(obj1))
// [ 'age', 'sex', Symbol(abc), Symbol(def) ]
Symbol.iterator 迭代器 和 生成器 for of
let arr: Array<number> = [1, 2, 3, 4];
let it: Iterator<number> = arr[Symbol.iterator]();
console.log(it.next()) // { value: 1, done: false }
console.log(it.next()) // { value: 2, done: false }
console.log(it.next()) // { value: 3, done: false }
console.log(it.next()) // { value: 4, done: false }
console.log(it.next()) // { value: undefined, done: true }
未完待续。。。