① 方法一:通过JSON.stringify(obj)
来判断两个对象转后的字符串是否相等
优点:用法简单,对于顺序相同的两个对象可以快速进行比较得到结果
缺点:这种方法有限制就是当两个对比的对象中key的顺序不是完全相同时会比较出错
② 方法二:Object.getownPropertyNames()
1.用Object.getOwnPropertyNames拿到对象的所以键名数组
2.比对键名数组的长度是否相等
3.比对键名对应的键值是否相等
缺点:对象属性是对象的情况要进行递归
未递归情况:
function isObjectValueEqual(a, b) {var aProps = Object.getOwnPropertyNames(a);var bProps = Object.getOwnPropertyNames(b);if (aProps.length != bProps.length) {return false;}for (var i = 0; i < aProps.length; i++) {var propName = aProps[i];var propA = a[propName];var propB = b[propName];if ( propA !== propB) {return false;}}return true;}
递归情况:
function isObjectValueEqual(a, b) {var aProps = Object.getOwnPropertyNames(a);var bProps = Object.getOwnPropertyNames(b);if (aProps.length != bProps.length) {return false;}for (var i = 0; i < aProps.length; i++) {var propName = aProps[i]var propA = a[propName]var propB = b[propName]// 这里忽略了值为undefined的情况// 故先判断两边都有相同键名if(!b.hasOwnProperty(propName)) return falseif ((propA instanceof Object)) {if (this.isObjectValueEqual(propA, propB)) {// return true这里不能return ,后面的对象还没判断} else {return false}} else if (propA !== propB) {return false} else { }}return true}var a = {id:1,name:2,c:{age:3}};var b = {id:1,name:2,c:{age:3}}console.log(isObjectValueEqual(a,b));//true