注册列表示例一个社交网络有一组成员,每个成员有一个存储其朋友信息的注册列表。function Member(name){ this.name=name; this.friends=[];}var a=new Member(钟二), b=new Member(张三), ...
注册列表示例
一个社交网络有一组成员,每个成员有一个存储其朋友信息的注册列表。
function Member(name){ this.name=name; this.friends=[];}var a=new Member('钟二'), b=new Member('张三'), c=new Member('赵四'), d=new Member('王五'), e=new Member('阮六'), f=new Member('耿七');a.friends.push(b);b.friends.push(c);c.friends.push(e);d.friends.push(b);e.friends.push(d,f);
搜索该网络意味着需要遍历该社交网络图。通常通过工作集来实现。工作集以单个根节点开始,然后添加发现的节点,移除访问过的节点。
for...in遍历图
使用for...in循环来实现该遍历是很方便的。
Member.prototype.inNetwork=function(other){ var visited={}; var workset={}; workset[this.name]=this; for(var name in workset){ var member=workset[name]; delete workset[name]; if(name in visited){ continue; } visited[name]=member; if(member===other){ return true; } member.friends.forEach(function(friend){ workset[friend.name]=friend; }); } return false;}
上面代码有什么问题嘛?在大多环境下可以工作,但有一些环境这段代码就不能工作了。
a.inNetwork(f);//false
这里为什么呢。这里说明for...in循环在运行时出错了错误,并没有要求枚举对象的修改与当前保持一致。事实上,ES对并发修改在不同js环境下的行为的规范留有余地。标准规定:
原标题:[Effective JavaScript 笔记]第48条:避免在枚举期间修改对象
关键词:JavaScript
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。