var ary = [false, true, undefined, null, NaN, 0, 1, 1, "1", "1", {}, {}, "a", "a", NaN];
1、indexOf 方法,无法识别NaN
Array.prototype.uniq = function() {
return this.filter(function(item, pos) {
return this.indexOf(item) == pos;
});
};
2、hasOwnProperty,对象属性检测,无法识别 1,‘1’
Array.prototype.uniq = function() {
var map = {};
return this.filter(function(item) {
return map.hasOwnProperty(item) ? false : (map[item] = true);
});
};
3、type of 数据类型,无法区分{}
Array.prototype.uniq = function() {
var prims = {
boolean: {},
number: {},
string: {}
};
var obj = [];
return this.filter(function(item) {
var type = typeof item;
if (type in prims) {
return prims[type].hasOwnProperty(item) ? false : (prims[type][item] = true);
} else {
return obj.indexOf(item) != -1 ? false : (obj.push(item));
};
});
};
4、数据类型+对象 //效果好,能够准确区分
Array.prototype.uniq = function () {
var map = {};
return this.filter(function (item) {
var key = typeof item + item;
return map.hasOwnProperty(key) ? false : (map[key] = true);
});
};
// CONSOLE
[false, true, undefined, null, NaN, 0, 1, "1", {}, "a"]
5、JSON.stringify //无法区分NaN,null
Array.prototype.uniq = function() {
var map = {};
return this.filter(function(item) {
var key = JSON.stringify(item);
return map.hasOwnProperty(key) ? false : (map[key] = true);
});
};