JavaScript判断对象是否相等
实现一、
var obj = {a:'a'},obj1 = {b:'b'},obj2 = {a:'a'};
就是使用
JSON.stringify()
先把对象转化成字符串,
这样就可以啦
console.log(JSON.stringify(obj) == JSON.stringify(obj1));//false
console.log(JSON.stringify(obj) == JSON.stringify(obj2));//true
弊端:这样不是很严谨,如果一个对象里是有两个属性的,只是位置不一样而已,这样的方法就是错误的
var a ={"name":"lsx","age":12};
var b ={"age":12,"name":"lsx"};
console.log(JSON.stringify(a) == JSON.stringify(b))
------false
实现二、
思路
只要两个对象的名和键值都相同。那么两个对象的内容就相同了
1.用Object.getOwnPropertyNames拿到对象的所有键名数组
2.比对键名数组的长度是否相等。否=>false。真=>3
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;
弊端:粗略一看没问题,但是细心的同学发现如果 键值也是对象的话,那这个方法就不管用了,比如下面的测试数据
 var a = {
        id:1,
        name:2,
        c:{
            age:3
        }
    };
    var b = {
        id:1,
        name:2,
        c:{
            age:3
        }
    }
    console.log(isObjectValueEqual(a,b));//false
实现三、
在实现二的基础上递归实现
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 ((typeof (propA) === 'object')) {
          if (this.isObjectValueEqual(propA, propB)) {
              return true
            } 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
【注】、上面三种方式实现三是最靠谱的
JavaScript判断对象是否相等的更多相关文章
- JavaScript判断对象的类型
		JavaScript判断对象的类型 最近阅读了一些关于JavaScript判断对象类型的文章.总结下来,主要有constructor属性.typeof操作符.instanceof操作符和Object. ... 
- JavaScript判断对象类型及节点类型、节点名称和节点值
		一.JavaScript判断对象类型 1.可以使用typeof函数判断对象类型 function checkObject1(){ var str="str"; console.lo ... 
- Javascript 判断对象是否相等
		在Javascript中相等运算包括"==","==="全等,两者不同之处,不必多数,本篇文章我们将来讲述如何判断两个对象是否相等? 你可能会认为,如果两个对象 ... 
- javascript 判断对象类型
		typeof typeof是一个一元运算符,它返回的结果 始终是一个字符串,对不同的操作数,它返回不同的结果. 此表总结了typeof所有可能的返回值: 操作数类型 返回值 undefined &qu ... 
- [转] javascript 判断对象是否存在的10种方法总结
		[From] http://www.jb51.net/article/44726.htm Javascript语言的设计不够严谨,很多地方一不小心就会出错.举例来说,请考虑以下情况.现在,我们要判断一 ... 
- JavaScript 判断对象中是否有某属性
		判断对象中是否有某属性的常见方式总结,不同的场景要使用不同的方式. 一.点( . )或者方括号( [ ] ) 通过点或者方括号可以获取对象的属性值,如果对象上不存在该属性,则会返回undefined. ... 
- javascript 判断对象的内置类型
		判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法.在toString方法被调用时,会执行下面的操作步骤:1. 获取this对象的[[Class ... 
- JavaScript判断对象数组中是否存在某个对象【转】
		1. 如果要判断数组中是否存在某个元素的话很好判断,直接用数组的indexOf方法就好,存在返回当前索引不存在返回-1 var arr=[1,2,3,4] arr.indexOf(3) arr.ind ... 
- javascript判断对象是否为domElement
		我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法. 要判断一个对象是否DOM对象,首先想到的无非就是它是否具有D ... 
- JavaScript判断对象和数组
		在调用后端接口时,由于后端接口的不规范统一,接口最外层在没有数据时返回的是空数组(其实更想要的是空json对象,接口返回的data数据应该统一返回json对象,便于扩展),而在有数据时返回的是json ... 
随机推荐
- 6,Stack
			一,Stack简介 Stack是栈.它的特性是:先进后出(FILO, First In Last Out). java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组 ... 
- 未能加载文件或程序集 ICSharpCode.SharpZipLib
			Ui调用Webservice ,Webservice调用Bl BL中明明有那个dll文件 后来发现是webservice里面没有 在附加调试的时候,断点在bl层中 
- C# 与 C++,语法差别有多小-其他2
			1. 内存分配 C++:指针在堆区(new),定义在栈区 C#: 对象在堆区,值在栈区.不允许不通过new在构造对象 2.变量 C++: char 1个字节 ascii C#: char 2个字 ... 
- Zsh vs. Bash不完全对比解析,zsh是一种更强大的被成为“终极”的Shell
			https://www.zhihu.com/question/21418449 Mort | Zsh vs. Bash:不完全对比解析(1) 2014-10-07 bdpqlxz Zsh和B ... 
- cmath模块——复数域数学函数模块
			cmath——复数域数学函数模块 转自:https://blog.csdn.net/zhtysw/article/category/7511293 该模块属于内置模块,随时可以调用.它提供了数学函数在 ... 
- PHP 开启错误显示并设置错误报告级别
			警告:生产环境永远都不要显示任何错误信息! 显示错误(display_errors)和错误报告(error_reporting)是两回事.PHP 脚本发生错误时,可以根据设置选择是否报告这个错误(记录 ... 
- 20190815 On Java8 第五章 控制流
			第五章 控制流 迭代语句 逗号操作符 在 Java 中逗号运算符(这里并非指我们平常用于分隔定义和方法参数的逗号分隔符)仅有一种用法:在 for 循环的初始化和步进控制中定义多个变量.我们可以使用逗号 ... 
- Hexo-博客yilia主题创建分类(categories)和标签(tags)首页
			转载自:http://orzcss.com/posts/5a207d64/ 概述 默认安装的 hexo 本身是没有分类和标签首页的,例如:http://orzcss.com/categories/页面 ... 
- webpack2.0 基本使用
			webpack是一款前端模块打包工具, 它的出现是由于现代web开发越来越复杂,如果还是像原来那样把所有的js代码都写到一个文件中,维护非常困难.而解决复杂化的方法通常是分而治之,就是把复杂化的东西进 ... 
- python学习第一天变量命名规范和变量作用
			变量的命名 python中的变量跟其他编程语言变量一样 1,由字母,下划线,数字组成 2,数字不能做变量名开头 3,变量名尽量有意义和短,,也可以驼峰,不要很low ,比如说是 中文,变量名很长 py ... 
