封裝去重方法、精確返回type值方法
阿新 • • 發佈:2018-12-15
由於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;
}