有时候需要存储一组函数,但要确定函数在这个集合中不能重复,绝大多数第一个想到的是将所有的函数保存在数组中,然后遍历数组检查重复的函数,其实可以利用函数属性的特性,给函数添加一个附加属性实现
var store = { nextId:1, cache:{}, add:function(fn){ if(!fn.id){ fn.id = store.nextId++; return !!(store.cache[fn.id] = fn); } } } var fn = function(){} console.log(store.add(fn)); console.log(store.add(fn));
在add中我们首先检测要添加的属性是否有一个id属性,如果有,则表示函数已经处理过,忽略它,如果没有则给函数分配一个id属性,然后将函数作为一个cache属性添加进来,同时使用id值作为属性名称。
!! 构造是一个可以将任意javascript表达式转化为等效布尔值的简单方式。例如!!"he shot me down" === true