function Set(){ this.values = {}; // 集合数据保存在对像的属性里 this.n = 0; // 集合中值的个数 this.add.apply(this, arguments); // 把所有参数(数组: [1,2,3])都添加到这个集合, 参数本来就是数组形式 } Set.prototype.add = function(){ for(var i =0; i<arguments.length; i++){ var val = arguments[i]; var str = Set._v2s(val); if(!this.values.hasOwnProperty(str)){ this.values[str] = val; this.n++; } } return this; //支持链式方法调用 } Set.prototype.remove = function(){ for(var i =0; i<arguments.length; i++){ var val = arguments[i]; var str = Set._v2s(val); if(this.values.hasOwnProperty(str)){ delete this.values[str]; this.n--; } } return this; } // 如果集合中包含这个值, 则返回true Set.prototype.contains = function(value){ return this.values.hasOwnProperty(Set._v2s(value)) } Set.prototype.size = function(){ return .this.n; } // 遍历集合中的所有元素, 在制定的上下文中调用f Set.prototype.foreach = function(f, context){ for(var s in this.values) if(this.values.hasOwnProperty(s)) // 忽略继承的属性 f.call(context, this.values[s]); // 调用f , 传入value } // 这是一个内部函数, 用以将任意的 JavaScript 值 和唯一的字符串对应起来 Set._v2s = function(val){ switch(val){ case undefined : return 'u'; //特殊的原始值 case null: return 'n'; // 值只有一个字母 case true: return 't'; // 代码 case false: return 'f'; default : switch(typeof val){ case 'number' : return '#' +val; case 'string' : return '"' + val; default: return '@'+objectId(val); } } function objectId(o){ var prop = "|**objectid**|"; if(!o.hasOwnProperty(prop)) o[prop] = Set._v2s.next ++; return o[prop]; } } Set._v2s.next = 100;