isEqual ,判断两个对象或变量是否相等
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 }