使用Object的直接量实例构造轻量级的字典:
- 使用for/in循环,使用对象字面量来构建,并确保不增加Object.prototype属性来导致for/in循环;(考虑到兼容性,如Array.prototype是允许增加属性的);
- 如果确实需要在Object.prototype中增加属性那么使用Object.defineProperty
Object.defineProperty(Object.prototype, 'allkeys', {
value : function () {
var reuslt = [];
for(var key in this) {
result.push(key);
}
reutrn result;
},
writable: true;
enumberable: false;
configurable: true;
})
防止原型污染:
- 使用null,Object.create: var a = Object.create(null);
使用hasOwnProperty方法避免原型污染:
- 考虑到要检测的对象的hasOwnProperty可能被污染:
var hasOwn = {}.hasOwnProperty;
hasOwn.call(obj,'proto');
------------------------------------------
function Dict(elems) {
this.elems = elems || {};
}
Dict.prototype.has = function(key) {
return {}.hasOwnPrototype.call(this.elems, key);
}
Dict.prototype.set = function(key, val) {
this.elems[key] = val;
}
Dict.prototype.remove = function (key) {
delete this.elems[key];
}
使用数组而不是字典类存储有序集合:
- 使用for/in循环来枚举对象属性应当与顺序无关;
- 如果聚集运算字典中的数据,确保聚集操作与顺序无关;
避免在枚举期间修改对象:
- 如果被枚举的对象在枚举期间添加了新的属性,则不能保证for/in循环的行为是可预见的;
- 当迭代对象时,使用while或者for替代while;
使用迭代方法:
- 可以使用迭代方法代替for循环增加可读性;
- 在需要提前终止循环的情况下,仍然使用传统循环;
- 早类数组对象上复用通用的数组方法;[].forEach.call();