①利用ES6的Set集合利用ES6 Set集合成员具有唯一值的特性,再借助Array.from将类数组转为真正的数组我们可以很简单的完成数组去重任务let res = Array.from(new Set(arr));②indexOf和filter的配合indexOf():返回数组中某个指定的元素第一次出现的位置(索引)。如果在数组中没找到指定元素则返回 -1。filter():返回指定数组中符合条件的所有元素关键语句:index === array.indexOf(ele)我们利用indexOf得到的下标与当前元素的下标来判断这个元素是否是第一次出现,然后在利用filter的过滤特性即可。这里需要注意的判断NaN,因为 NaN !== NaN,所有indexOf(NaN)始终返回-1,所以我们需要额外去判断Array.prototype.uniq = function(){ let flag = true; // 定义标记用来判断NaN return this.filter((ele, index, array) => { if(flag && ele!==ele){ flag = false; return true; } return index===array.indexOf(ele) })}③利用对象的键核心:利用对象的键来存储我们的元素如果没有对象中没有这个键,则进行存储,并设置这个键对应值为true,表明已经存在该元素Array.prototype.uniq = function(){ let hash = {}; let data = []; this.forEach(ele => { if (!hash[ele]) { hash[ele] = true; data.push(ele); } }) return data;} 注意:由于普通对象的键都是字符串,所以对于像 Number(1)和String(1)则视为它们是同一值,无法正确判断,对于引用类型的数据也是如此( 如 {} 和 {} 视为同一值)解决办法:在ES6中提供了Map集合,Map的键不再局限于字符串,而是任意类型,可以说是一个完整的hash结构,利用Map替换普通对象{}则可以解决上面的问题Array.prototype.uniq = function(){ let map = new Map(); let data = []; this.forEach(ele => { if(!map.get(ele)){ map.set(ele, true); data.push(ele); } }); return data;}