/**
* Created by Administrator on 2015/4/14.
*/
function Set() {
this.values = {};
this.n = 0;
this.add.apply(this, arguments);
}
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;
},
remove: function () {
for (var i = 0; i < arguments.length; i++) {
var str = Set._v2s(arguments[i]);
if (this.values.hasOwnProperty(str)) {
delete this.values[str];
this.n--;
}
}
return this;
},
contains: function (value) {
return this.values.hasOwnProperty(Set._v2s(value));
},
size: function () {
return this.n;
},
foreach: function (f, context) {
for (var s in this.values) {
if (this.values.hasOwnProperty(s)) {
f.call(context, this.values[s]);
}
}
}
};
Set={
//這是一個內部函式,用任意的javascript的值和唯一的字元竄對應連線起來
_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];
};
}
}; //設定初始值100
Set._v2s.next=100;