symbol成为了一种新的原生类型,就像number和string一样
let a1:symbol = Symbol('key'); // 可以接收三个值
let a2:symbol = Symbol("key"); // 可选的字符串key
//for Symbol for全局symbol 查找有没有注册过这个 key 如果有就直接拿来用,没有就创建一个,所以 这里一定是为 true 的
console.log(Symbol.for('daBai') === Symbol.for('daBai')) //返回为 true
// 应用
let obj ={
name:'大白',
[a1]:1230,
[a2]:'原神',
}
// 输出结果: { name: '大白', [Symbol(key)]: 1230, [Symbol(key)]: '原神' }
// 可以发现 Symbol是一样的,但是他里面的值却没有覆盖掉,Symbol就是去解决属性的 key 值重复的问题
console.log(obj)
// for in 不能读到 Symbol
for (let i in obj){
console.log(i)
// 打印结果: name 只能读到name ,symbol 是读不到的
}
console.log(Object.keys(obj)) // 打印结果: [ 'name' ] symbol 也是读不到的
console.log(Object.getOwnPropertyNames(obj)) // 同上,也是读取不到
// 这个方法是可以读取到 symbol 的
console.log(Object.getOwnPropertySymbols(obj)) //[ Symbol(key), Symbol(key) ]
// 这可以读取到 name 和 symbol
console.log(Reflect.ownKeys(obj)) //[ 'name', Symbol(key), Symbol(key) ]
[迭代器|生成器]
生成器
//生成器 跟迭代器用法一样
function * atn(){
yield Promise.resolve('大白') // 同步 后面跟异步 都可以
yield '小白'
yield '原神'
yield 'LoL'
}
const a =atn()
console.log('第一次调用',a.next()) // 再调用第二次,会返回第二个值,按顺序来
console.log('第二次调用',a.next())
console.log('第3次调用',a.next())
console.log('第4次调用',a.next())
console.log('第5次调用',a.next()) // x此时 done:true ,是因为已经没有东西可以迭代了
- 在 TypeScript 中,迭代器有以下几个:
-
for…of 循环:for…of 循环可以遍历所有可迭代对象中的值。
-
forEach() 方法:forEach() 方法可以对数组进行迭代,不需要手动创建迭代器。
-
entries() 方法:entries() 方法可以返回一个包含键/值对的迭代器。
-
keys() 方法:keys() 方法返回一个包含所有键的迭代器。
-
values() 方法:values() 方法返回一个包含所有值的迭代器。
-
Symbol.iterator 属性:Symbol.iterator 属性可以自定义可迭代对象中的迭代器
可看ts文档
迭代器
// set map
// Set 是一种集合型数据结构,它只会存储唯一的值,因此重复的数字只会被保留一次
let set: Set<number> = new Set([1, 1, 2, 2, 3, 4, 4, 5]) // 天然去重
console.log(set)
let map: Map<any, any> = new Map()
let Arr = [1, 2, 3]
map.set(Arr, '大白')
console.log(map.get(Arr)) // 可以取到 大白
// function ag(){
// console.log(arguments) //伪数组
// }
// let ls = document.querySelectorAll('div') // 伪数组
const aer = (value:any) =>{
let It:any = value[Symbol.iterator]()
let next:any = {done:false}
while (!next.done){
next = It.next()
if(!next.done){
console.log(next.value)
}
}
}
// // 支持 map set Arr
aer(map) // 打印结果:[ [ 1, 2, 3 ], '大白' ]
// 迭代器的语法糖 for of
for (let value of map) {
console.log(value) // 此时报错
}
// for of 对象不能用
// for (let value of {age:20}){
// console.log(value) // 此时报错
// }
// 解构 也是调用 iterator
let [q, s, d] = ['LOL', '原神', '大白']
console.log(q, s, d)
让对象支持 for of
let obj = {
items: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
let items = this.items;
return {
next() {
if (index < items.length) {
return { value: items[index++], done: false };
} else {
return { done: true };
}
}
};
}
};
for (let item of obj) {
console.log(item);
}