1. 程式人生 > >封裝去重方法、精確返回type值方法

封裝去重方法、精確返回type值方法

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