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;