1 function isEqual(a, b) { 2 //如果a和b本來就全等 3 if (a === b) { 4 //判斷是否為0和-0 5 return a !== 0 || 1 / a === 1 / b; 6 } 7 //判斷是否為null和undefined 8 if (a == null || b == null) { 9 return a === b; 10 } 11 //接下來判斷a和b的數據類型 12 var classNameA=toString.call(a), 13 classNameB=toString.call(b); 14 //var classNameA = typeof(a), (兼容IE的寫法) 15 //classNameB = typeof(b); 16 //如果數據類型不相等,則返回false 17 if (classNameA !== classNameB) { 18 return false; 19 } 20 if (a instanceof Date) 21 { 22 classNameA = '[object Date]'; 23 } 24 25 //如果數據類型相等,再根據不同數據類型分別判斷 26 switch (classNameA) { 27 case '[object RegExp]': 28 case '[object String]': 29 case 'string': 30 //進行字符串轉換比較 31 return '' + a === '' + b; 32 case 'number': 33 case '[object Number]': 34 //進行數字轉換比較,判斷是否為NaN 35 if (+a !== +a) { 36 return +b !== +b; 37 } 38 //判斷是否為0或-0 39 return +a === 0 ? 1 / +a === 1 / b : +a === +b; 40 case '[object Date]': 41 case '[object Boolean]': 42 case 'boolean': 43 return +a === +b; 44 } 45 //如果是對象類型 46 if (classNameA == '[object Object]' || classNameA=='object') { 47 //獲取a和b的屬性長度 48 var propsA = Object.getOwnPropertyNames(a), 49 propsB = Object.getOwnPropertyNames(b); 50 if (propsA.length != propsB.length) { 51 return false; 52 } 53 for (var i = 0; i < propsA.length; i++) { 54 var propName = propsA[i]; 55 //如果對應屬性對應值不相等,則返回false 56 if (a[propName] !== b[propName]) { 57 return false; 58 } 59 } 60 return true; 61 } 62 //如果是數組類型 63 if (classNameA == '[object Array]') { 64 if (a.toString() == b.toString()) { 65 return true; 66 } 67 return false; 68 } 69 }