准确的数据类型判断
- 在js数据类型判断中,常使用
typeof
方法,但是只能返回原始值的准确数据类型。对于非原始值,会返回object
,不能有效的判断出数据类型。 - 利用原型的
toString
方法,结合typeof
,封装一个自己的数据类型判断方法。
function type(arg){
// 对于非原始值数据,调用对象原型的toString方法进行判断
const toStr = Object.prototype.toString.call(arg);
// typeof方法会返回原始值的准确类型
const rettypeof = typeof(arg);
// 该对象用于保存对象及包装类的数据类型
const objStr = {
'[object Number]': 'number-object',//数字包装类new Number(1)
'[object String]': 'string-object', // 字符串包装类 new String('a')
'[object Boolean]': 'boolean-object', // 布尔值包装类
'[object Array]': 'array', // 数组
'[object Object]': 'object', // 对象
};
// typeof(null) --> object
if(arg === null){
return 'null';
}
//
return rettypeof === 'object' ? objStr[toStr] : rettypeof;
}
// test
type('a') // 'string'
type(new Number(1)) // number-object
数组去重
- 不使用数组方法,借助对象key无重复特性去重数组
function uniqueArr(arr){
// type:上面自定义的数据类型检测方法
if(type(arr)!=='array'){
throw new TypeError(`${arr} data type must be Array.`)
}
const obj = {},
newArr = [],
len = arr.length;
for(let i = 0; i < len; i++){
if( !(arr[i] in obj) ){
//判断当前对象是否在对象中obj中
// 不存在则将数据分别添加进obj newArray中
// 最后返回newArray即可
obj[arr[i]] = 1;
newArr.push(arr[i]);
}
}
return newArr;
}