Symbol
自ECMAScript 2015,symbol成为了一种新的原生类型,就像number和string等一样
symbol类型的值是通过Symbol构造函数创建的 可以传递参做为唯一标识 只支持 string 和 number 类型的参数
let sym1 = Symbol('wodiu')
let sym2 =Symbol()
console.log(sym1,sym2);
Symbol的值是唯一的
let sy1 = Symbol()
let sy2 = Symbol()
console.log(sy1 === sy2); //false
问题来了,可以让两个symbol类型的值相等吗?
答案是 Yes!
const symbol1 = Symbol.for('foo');
const symbol2 = Symbol.for('foo');
console.log(symbol1 === symbol2); // true
用作对象的属性
let obj = {
[sym2]:"value",
str1:'岂有此理'
}
console.log(obj[sym2]);
使用symbol定义的属性,是不能通过如下方式遍历拿到的
let sy2 = Symbol()
let obj = {
[sym2]:"value",
str1:'岂有此理'
}
1. for in 遍历
for(let key in obj){
console.log(key,'for in'); // str1
}
//2. Object.keys 遍历
console.log(Object.keys(obj)); //['str1']
//3. getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj)); //['str1']
//4. JSON.stringfy
console.log(JSON.stringify(obj)); //{"str1":"岂有此理"}
怎么拿?
// 1 拿到具体的symbol 属性,对象中有几个就会拿到几个
console.log(Object.getOwnPropertySymbols(obj)); //[Symbol()]
// 2 es6 的Reflect 拿到对象的所有属性
console.log(Reflect.ownKeys(obj)); //['str1',Symbol()]
Symbol.iterator 迭代器 和 生成器 for of
var arr = [1,2,3,4]
let iterator = arr[Symbol.iterator]()
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
支持遍历大部分类型迭代器 arr nodeList argumetns set map 等
interface item {
name:string,
age:number
}
const array:Array<item> = [{name:'zhou',age:18},{name:'wang',age:16}]
type mapTypes = string | number
const map:Map<mapTypes,mapTypes> = new Map()
map.set('1','陆南de')
map.set(123,'路北的')
let set:Set<number> = new Set([1,222,222,3,4,3])
我们写一个迭代函数
const gen = (arg:any):void => {
let it: Iterator<any> = arg[Symbol.iterator]()
let next:any = {done:false}
while (!next.done) {
next = it.next()
if(!next.done){
console.log(next.value);
}
}
}
我们平时开发中不会手动调用iterator 应为 他是有语法糖的就是for of 记住 for of 是不能循环对象的y因为对象没有 iterator
for (let value of map) {
console.log(value)
}