Web 技术研究所

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

ES6 WeakSet

  以前的一篇文章中介绍过ES6的WeakMap,当时出于一些封装的需求非常渴望引入这概念,只是当时浏览器还没实现。如今,Chrome从36版开始已经实现了,而且不仅是WeakMap,连WeakSet都被一并实现了,这个连Firefox31(最新稳定版)都还没实现。
  之前使用WeakMap做数组去重的代码,现在可以换成WeakSet来实现了。因为在这个算法中,只需要存放对象,并判断其存在性的,不需要key-value结构,虽然WeakMap也能实现,但是WeakSet更合适。
<script>
function unique(s){
  var i,j,t,m=new WeakSet,o={};
  for(i=0,j=0;i<s.length;i++)
    //对象类型使用WeakSet,其它类型使用普通对象
    if((t=typeof s[i])=="object")
      m.has(s[i])||m.add(s[j++]=s[i]);
    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>

  最后要喷一下Chrome,这实现了WeakMap和WeakSet之后,对非Weak的Map和Set居然还要开flag才能用,我感到深深地不解。不过也快了,Chrome38之后就可以直接使用了,只是Firefox要到34才支持WeakSet,这还需要点时间。
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^