数组去重复
思路:
- 创建一个新的数组存放结果和创建一个空对象
- for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。
说明:至于如何对比,就是每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。
Array.prototype.unique3 = function() {
var res = [];
var json = {};
for (var i = 0; i < this.length; i++) {
if (!json[this[i]]) {
res.push(this[i]);
json[this[i]] = 1;
}
}
return res;
};
var arr = [112, 112, 34, '你好', 112, 112, 34, '你好', 'str', 'str1'];
console.log(arr.unique3());
判断数组
typeof
就可以判断大部分的类型;
console.log(typeof {a:2}); // "object"
console.log(typeof []); // "object"
console.log(typeof null); // "object"
console.log(typeof function() {return 1;}); // "function"
console.log(typeof 'abc'); // "string"
console.log(typeof 1); // "number"
console.log(typeof a); // "undefined"
console.log(typeof undefined); // "undefined"
console.log(typeof true); //"boolean"
可惜其中数组,对象和null都判断为对象。
es5中Array.isArray(arr);
就可以直接判断是否是数组,但不兼容ie8
还可以使用Object.prototype.toString()
来检测数据类型,比如数组。
下面代码能兼容到ie8
function isArrayFn(value) {
if (typeof Array.isArray === 'function') {
return Array.isArray(value);
} else {
return Object.prototype.toString.call(value) === '[object Array]';
}
}
console.log(isArrayFn([1,2,3]));//true
其中Object.prototype.toString(),方法参考这里
下面代码,相对不错的检测数据类型
方法
function isTypeFn(o) {
return Object.prototype.toString.call(o).slice(8,-1);
}
function isFnIE8(o) {
if(o===null) return 'Null';
if(o==='Undefined') return 'Undefined';
return Object.prototype.toString.call(o).slice(8,-1);
}
console.log(isFn(null)); //"Null"
console.log(isFn(undefined)); //"Undefined"
console.log(isFn(1)); //"Number"
console.log(isFn("")); //"String"
console.log(isFn(true)); //"Boolean"
console.log(isFn({})); //"Object"
console.log(isFn([])); //"Array"
console.log(isFn(new Date())); //"Date"
console.log(isFn(/./)); //"RegExp"
console.log(isFn(function f(){})); //function