你的位置:首页 > 软件开发 > Java > [Effective JavaScript 笔记]第48条:避免在枚举期间修改对象

[Effective JavaScript 笔记]第48条:避免在枚举期间修改对象

发布时间:2016-06-28 10:00:06
注册列表示例一个社交网络有一组成员,每个成员有一个存储其朋友信息的注册列表。function Member(name){ this.name=name; this.friends=[];}var a=new Member(钟二), b=new Member(张三), ...

[Effective JavaScript 笔记]第48条:避免在枚举期间修改对象

注册列表示例

一个社交网络有一组成员,每个成员有一个存储其朋友信息的注册列表。

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 (#换成@)。