Map Set 总结
Set
下面是Set的构造函数的原型
map
下面是Map的构造函数的原型
//Set声明
var setObj = new Set([1,2,3]) //参数为数组
- 取值需要同便利的形式,或者转成数组
- ar mapObj = new Map([[a,b],[c,d]]) //参数为二维数组 因为他们是 key => value 存在的
- 有取值和设置方法 即 set get 注意set方法参数为两个参数 而不是一个数组*
- 二者都存在的方法
- has delect keys values clear forEach entries
对迭代器的理解
// Set Map 迭代原理
var setObj = new Set([1,2,3]);
// [Symbol.iterator] == setObj.entries()
console.log(setObj[Symbol.iterator]().constructor == setObj.entries().constructor)
// 先说下正常的for of 循环 原理
// for...in 是通过Object.keys() 得到key []通过对数组进行便利 后面基本也是和of差不多的原理
// for(var i of obj){}
// obj 身上需要有个一Symbol.iterator方法返回一个 Iterator 迭代机
// iterator身上需要定义一个next()方法 next执行的时候需要返回 prointor指针位置的元素,和是否能迭代完成即{value:[v,i],done:Boolean} next里面需要定义if()条件来改变指针向下的位置。当指针不该改变是done应该返回true。
// 实现方式类似:
var obj = [1,2,3]
for(var a = obj[Symbol.iterator](),b = a.next();b.done != true;b = a.next()){
console.log(b)
}
//iter(entries)是我对迭代对象的forEach仿写
iter(setObj,function(v,i){
console.log(i,v)
})
setObj.forEach(function(i,v){
console.log(i,v) // {1 => 1;2 => 2;3 =>3}
})
var o = {a:1,b:2}
console.log(Object.keys(o))
for (k in o) {
console.log(k)
}
/*
* fx 其实为方法体的内容
*/
function iter(setObj,fx){
var entrior = setObj.entries()// 迭代初始化 建立forEach循环的时候 可以看作是一种状态
var iterMain = function(entrior,fx){
var prointor = entrior.next()//prointor 迭代器指针
if(!prointor.done){
//TODO
if(fx){
// 当前遍历的键值对
fx(prointor.value[1],prointor.value[0])
}
iterMain(entrior,fx)
}
}
iterMain(entrior,fx)
}
``// 更新 21/12/2
// 怎样自定义一个able object
interface iterator{
next:()=>{value:any,done:boolean}
} // 迭代器
// 1.实现一个可跌代的对象 主要是需要实现一个 Symbol.iterator = ()=> iterator
// 2.官方文档( https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols) 推荐是Symbol.iterator:Generator
// 3.Generator 理解为一个生成器
Function Generator() => iterator
// 所以实现一个 able Object,只需要给对象的 Symbol.iterator = Generator
// custom code
var a = {a:1,b:2}
a[Symbol.iterator] = function(){
var falg = 0;
var self = this;
return {
next: function(){
var key = Object.keys(self)[falg];
falg++;
console.log(key);
return{value:self[key],done:!key}
}
}
}
[...a] //[1, 2]