Symbol和迭代器
//如果一旦Symbol作为对象属性,for(var i in obj)、object.keys、JSON.stringify都是拿不到这个key的,所以私有属性
//Object.getOwnPropertySymbols 可以拿到
//for适合便利数组,forin适合便利键值对,还有就是一些对象的遍历方法如foreach。。,这些都有一定的局限性
//新引入的for of方式,以后的趋势
const arr2 = [1,2,3,4]
for(const item of newArr2){
if(item > 2) {
break
}
}
//arr.forEach()//不能跳出循环
//arr.some()返回true可跳出循环
//arr.every()返回false可跳出循环
//for of对于对象 set等的遍历一样,对于map遍历的时候,要注意以下:
const mmm = new Map()
mmm.set(‘foo’,‘123’)
mmm.set(‘bar’,‘234’)
for(const item of mmm){
console.log(“item”, item)//item竟然时一个数组,每个数组就两元素,一个key、一个value,所以结合数组的解构,可以方便拿到keyvalue
}
for(const [key,value] of mmm){
console.log(“item”, key, value)
}
//以下会报错,为什么呢,先看for of的原理
// const obje = {name : ‘a’, age : 18}
// for(const item of obje){
// console.log(‘item’,item)
// }
//for of工作原理:实现了一个iterable迭代接口
const iterator_set = mmmSymbol.iterator
console.log(“iterator next”, iterator_set.next())
console.log(“iterator next”, iterator_set.next())
console.log(“iterator next”, iterator_set.next())
console.log(“iterator next”, iterator_set.next())
//让forof可以遍历对象
const objjj = {
store : [‘foo’, ‘bar’, ‘baz’],
Symbol.iterator{
let index = 0;
const _this = this;
return {
next : function(){
const result = {
value : _this.store[index],
done: index >= _this.store.length
}
index ++
return result;
}
}
}
}
for(const item of objjj){
console.log(“item”, item)
}
//迭代器模式:任务列表的实现
const todos = {
life : [“吃饭”,“睡觉”,“打豆豆”],
learn:[“英语”,“语文”,“数学”],
//实现方式一
each: function(callback){
const all = [].concat(this.life, this.learn);
for(const item of all){
callback(item);
}
},
//实现方式二
Symbol.iterator{
const all = […this.life, …this.learn]
let index = 0;
return {
next: function(){
const result = {
value : all[index],
done : index >= all.length
};
index++
return result;
}
}
}
}
todos.each(item => console.log(item));
for(const item of todos){
console.log(item)
}