由于typeof()方法返回类型不准确。数组对象跟null都返回object
现自己封装一个type(),精确的返回类型
typeof([])------>array
typeof({})------>object
typeof('你好')----->string
typeof(function)---->function
typeof(123)----->number
typeof(new Number())--->[object number]
typeof(new Array())--->[object Array]
typeof(new String())--->[object String]
1.方法1 自己的蠢思路
// 我自己的蠢思路
function myType(str){
if (str == null) {
return null;
}
var type = typeof(str);
switch(type){
case 'object':
var objType = Object.prototype.toString.call(str);
switch(objType){
case "[object Array]":
console.log('Array');
break;
case "[object Object]":
console.log('object');
break;
case "[object String]":
console.log('object String');
break;
case "[object Number]":
console.log('object Number');
break;
}
console.log();
break;
case 'number':
console.log('number');
break;
case 'string':
console.log('string');
break;
case 'function':
console.log('function');
break;
case 'boolean':
console.log('boolean');
break;
case 'undefined':
console.log('undefined');
break;
}
}
2.方法2 老师的思路
// 老师的好思路
function type(target){
var ret = typeof(target);
// 再来分别处理引用值跟原始值的情况
// 先将引用值对应的类型写一个模板对象出来
var obj = {
'[object Number]' : 'number-object',
'[object String]' : 'string-object',
'[object Array]' : 'array',
'[object Object]' : 'object',
}
// typeof()为object时为引用值
// 先来排除掉target为null的情况
if(target === null){////这里必须用全等号,如果用==,会加上undefined的情况
return 'null';
}else if (ret == 'object') {
// 要细分引用值的类型,需要用原型上的toSting()
var objType = Object.prototype.toString.call(target);
// 直接将返回的objType在模板obj中查找值
return obj[objType];
}else{
// 原始值可以直接用typeof()判断出来。这里直接用typeof
return ret;
}
}
2、数组去重
在原型链上添加一个数组去重函数
思路:将数组中的值放到新对象中,作为对象的键(属性名)。
由于对象中的属性名都是唯一的,不会重复。所以自动将数组的值去重作为键。
然后再用新数组接收这个对象的键
Array.prototype.unique = function(){
var temp = {},
newArr = [],
len = this.length;//将length先计算出来,循环可以省时
for (var i = 0; i < len; i++) {
// 如果没有这个键值对才加入这个键
if (!temp[this[i]]) {
temp[this[i]] = 'a';//只需要键,值课随意,
// (但值不能是有可能为0(false)的值。)否则会进入第二次
newArr.push(this[i]);//直接加入新数组
}
}
return newArr;
}