Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript的新一代神器:WeakMap

  之前的文章介绍过数组去重的方法。因为JavaScript无法直接取对象指针,无法将对象作为key来使用,我们为对象类型的数组元素我们会为其添加一个临时名称以做标识符。ES6中提供了WeakMap对象,它可以将对象作为key,这么一来许多问题就迎刃而解。
  大家最关心的也许是兼容性问题。Firefox很久以前就支持了,IE在11版本也开始支持。遗憾的是原生的Chrome尚未支持,但v8实际上已经支持了,所以在NodeJS中开启harmony模式就可以使用。
  于是对于数组去重的问题我们可以这样简单地实现
<script>
function unique(s){
  var i,j,t,m=new WeakMap,o={};
  for(i=0,j=0;i<s.length;i++)
    //对象类型使用WeakMap,其它类型使用普通对象
    if((t=typeof s[i])=="object")
      m.has(s[i])||m.set(s[j++]=s[i],true);
    else o[t+=s[i]]||(o[t]=true,s[j++]=s[i]);
  s.splice(j); //删除多余项
};

//生成测试数据
var data=function(l){
  var a=[],s=[],i;
  //随机产生数字、字符串、对象,三种类型的测试数据
  for(i=0;i<l;i++)s.push([i,i+"",{value:i}][Math.random()*3|0]);
  for(i=0;i<l;i++)a.push(s[Math.random()*l|0]); //随机组合数据
  return a;
}(1E5);

unique(data);

console.log(data.length/1E5); // ≈ 1-lim[(1-1/n)^n] ≈ 1-1/e ≈ 0.63
</script>
  这个去重只是一个用法的例子,我们还可以用它来实现一个事件模型基对象,这样一来,事件的记录就无需再使用Closure,类似Closure被托管了的感觉。另外,这个WeakMap也有它自己的一些性质。之所以是“Weak”就是因为它作为key的对象是弱引用的,这意味着对象不会因为对象被作为key使用而无法被GC回收。也就是说,对象还是可以正常的回收,不会造成任何内存泄露的问题。但正因为如此,WeakMap就无法遍历其中的对象。访问数据就必须提供key。
  总的来说,它绝对是个未来框架封装的神器,但愿Chrome早点支持上。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^