封装去重方法、精确返回type值方法

本文介绍了一种改进的JavaScript类型检测方法,解决了typeof()的局限性,精确区分数组、对象、字符串等类型,并提供了一个自定义的type()函数实现。此外,还分享了数组去重的高效技巧,通过在原型链上添加unique()函数,利用对象键的唯一性快速去除数组中的重复元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值