众所周知,new Set()方式不可以去重空对象空数组以及包装类函数(可以理解为构造函数),那么在new Set()的方法上进行封装  可不可以呢  太麻烦,而for循环两次比较去重也麻烦  在这里 小曹推荐大家使用对象key不能重复的原理  实现数组去重  上代码:

  // 封装数组去重 把数组的值放到对象里面的key  利用key不能重复的原理去重最不会出错
    var array = [1, 2, 1, 2, {}, {}, undefined, undefined, null, null, new Array(), new Number(), new Number(), new Array(), [], []]
    Array.prototype.unique = function () {
      var obj = {}
      var arr = []
      var len = this.length;

      for (var i = 0; i < len; i++) {
        if (!obj[this[i]]) {
          obj[this[i]] = 'abc'
          arr.push(this[i])
        }
      }
      return arr

    }
本来一开始想用type判断一下传进来的是不是数组作相应的提示  后来发现不需要  直接在Array的原型链上面编程就好了  哈哈原型链真好用  这样就只有数组才有该方法
关键在于取数组值之后,判断这个空对象里面如果没有值 给这个对象的key为数组元素赋值对应的value---“abc”(最好string类型  不然判断取反可能会像0有隐式转换为false)
这样 一路for循环遍历下去  obj的key是不会被重复命名的,所以遇到相同的也就跳过啦  这样就实现了去重,应付一切数组。 原理简单点就是obj.name = 'abc'后,obj.name再出现一次,就不会进入if循环  就不会push到新的数组里面被去重函数返回.