比较两个对象的键值是否全等,说的就是字面上的相等,也就是看起来的一模一样的,举个栗子

 let o1 = {                      let o2 = {name: 'joe',                    name: 'joe'  isOld: false,                   isOld: false,age: 24,                        age: 24,blank: null,                    blank: null,what: undefined,                what: undefined,fun: function() {               fun: function() {return 'test';                      return 'test';},                              },strange: NaN,                  strange: NaN,newType: Symbol('symbol')       newType: Symbol('symbol')}                                    }

上面这两个对象你说相等不相等,肯定不相等,但是键值是否全等,那的确就是全等的,我们就是要写个函数来检查两个函数是否键值全等 (键的顺序是不分的),那我们就来理清一下写这个函数的思路:
我们肯定是要遍历键去对比,所以我们先保证长度是一致的

1. 获取两个对象的键数组,然后对比长度
2. 不同得类型的属性你得用不同得方法判断属性值是否相等,这里并不是指基本类型,而是我们要做不同方法判断时候分成4种
  1. Number , Boolean, String, Null, Undefined 这5种基本类型我们可以直接对比,
 Object.is(params1, params2); // 为什么不用 ===, 因为Number类型会有NaN
  1. Symbol和Function,这种基本类型我们直接对比不了,只能转为字符串对比
 (String(params1) === String(params2)) // 为什么不用toString(), 因为Function没有toString()
  1. Object,这个我们无法直接对比,因为你不知道它里面还包含多少的东西,所以这个要递归分解成其他的数据类型在对比,后面就是用递归来解决Object的对比
  2. ,函数这个就比较特殊了,这个只能是转成字符串去对比一下
 (String(function() {let aa= 1}) === String(function() {let aa= 1}))
3. 我们还要知道怎么去判断值是属于哪种类型,我们就使用 typeof 去判断,对于null值,typeof 会返回 object,所以如果是object 类型还要判断一下是否是恒等于null
 if (typeof val === 'object' && val !== null) // 这是object类型了if (typeof val === 'symbol') // Symbol类型if (typeof val === 'function') // Function类型else // 剩下得类型就是 Number , Boolean, String, Null, Undefined

好了说了一大堆,我们要开始写代码了,还有记住es6获取所有键得方法,Object.keys()会返回一个键得数组,上代码

    /*** @Description 比较两个对象键值全等* @author joe* @date 2020-11-15 14:59:03* @param {Object} objOne 对象1* @param {Object} objTwo 对象2* @return {Boolean} 是否键值全等**/function objKeyValueIsSame(objOne, objTwo) {let keysOne = Object.keys(objOne); // 获取对象1所有键数组let keysTwo = Object.keys(objTwo); // 获取对象1所有键数组if (keysOne.length !== keysTwo.length) return false; // 对比一下键得长度是否相等,如果不等则直接返回true// 开始遍历键去获取对象值对比,我们思路是值不匹配则返回false,但是如果匹配则则什么都不要,继续循环,直到循环结束,没有返回false就行了for (let key of keysOne) {if (typeof objOne[key] === 'object' && objOne[key] !== null) {  // 如果是对象,则再递归对比,如果递归返回false,则直接方法也直接返回falseif (!objKeyValueIsSame(objOne[key], objTwo[key])) return false;} else if (typeof objOne[key] === 'function' || typeof objOne[key] === 'symbol') { // 如果是function或symbol,转字符串再对比,不匹配则直接返回falseif (String(objOne[key]) !== String(objTwo[key])) return false;} else {  // 最后其他类型用es6得Object.is()来比较,不匹配直接返回falseif (!Object.is(objOne[key], objTwo[key])) return false;}}return true;  // 遍历结束了没有返回false,说明没有问题,这里直接返回true,表示键值全等了}let aa = {age: 24,blank: null,what: undefined,fun: function () {return 'test';},strange: NaN,newType: Symbol('symbol')}let bb = {age: 24,blank: null,what: undefined,fun: function () {return 'test';},strange: NaN,newType: Symbol('symbol')}console.log(objKeyValueIsSame(aa, bb))

上面得代码两个重点

  1. 你得明白递归
  2. 思路是如果遍历时候有不匹配就返回false直接结束整个函数,但是匹配得不要返回true,因为遍历的时候你不知道有没有遍历完,所以再for循环下面再返回ture

总结

最后总结一下,你要知道一个object里面的属性可以有多少种类型,然后每种类型应该用什么的对比方法

JS对比两个对象键值全等相关推荐

  1. js比较两个对象数组是否相同

    1.js 比较两个对象数组是否完全相同 let obj1 = [{"id" : 1, "name" : "xiaoMing"}]; let ...

  2. 前端 项目中 判断两个对象value值是否相等

    项目中的实例 看上图知道,点击了支付时,验证了选中行的主体信息,不一致就给提示信息,一致就出现弹框(这里弹框没有写) 那么我们就要在循环遍历的基础上,判断选中的行信息的 某个值是否相等. 也就是 判断 ...

  3. js中两个对象的比较

    代码取自于underscore.js 1.8.3的isEqual函数. 做了一些小小的修改,主要是Function的比较修改. 自己也加了一些代码解读. <!DOCTYPE html> & ...

  4. js (查重)键值对数组(一维数组),并归类计数

    js (查重)键值对数组(一维数组),并归类计数 全部代码 · 示例如下: 仅作为demo演示 <!DOCTYPE html> <html><head><me ...

  5. vue 判断两对象是否一致_判断两个对象的值是否相等

    判断两个对象的值是否相等 源代码 function isEqual (a, b) { const classNameA = toString.call(a) const classNameB = to ...

  6. 对比两张图片的MD5值

    图片上传的时候,通过对比两张图片的MD5值,判断图片是否上传成功. package com.kedacom.testdemo.javaTest;import java.io.File; import ...

  7. JAVA杂谈 —— 1.2 JS比较两个对象内容是否相同

    JS比较两个对象内容是否相同 -- JAVA 欢迎观看本博客 题目详情 欢迎观看本博客   您好! 这是我编程上遇到的困惑,现在记录下来.如有疏漏与不足之处还请多多指教. 题目详情   在实际开发中, ...

  8. js比较两个对象是否相同的函数

    js比较两个对象是否相同的函数 很多时候需要比较两个对象,来判断是否可以提交表单等操作,此时就需要比较两个对象是否相同,参考其他人的方法,自己写了以下函数来比较两个对象 /*** 两个对象比较* @p ...

  9. Java中对比两个对象中属性值[反射、注解]

    在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...

最新文章

  1. 分布式系统唯一ID生成方案汇总【转】
  2. python要学多久-零基础python培训需要学多久?
  3. Linux必学60个命令文件处理
  4. React中使用setState
  5. mysql触发器查询别的表_Oracle触发器查询统计本表
  6. git 获取最新代码_常用命令之git操作(入门篇)
  7. Web前端进阶之JavaScript模块化编程知识
  8. JDK 12:实际中的切换语句/表达式
  9. mysql bitmap index_[MySQL] mysql中bitmap的简单运用
  10. Python中dataframe数据框中选择某一列非空的行
  11. 俞敏洪回应新东方股价跌破1美元
  12. Mybatis-Plus条件构造器
  13. 求职面试准备——自我介绍
  14. 拼多多玩出花的社交电商 你知道多少?四川海昇智深度解析来啦
  15. python360安全浏览器_使用python3.7 的pycharm selenium自动化测试中启动360浏览器、360极速浏览器的方法...
  16. 程序员的算法趣题Q67: 不挨着坐是一种礼节吗?
  17. Illustrator “图像裁切”功能如何使用?
  18. oracle sql语句加速选项,Oracle SQL优化基本步骤
  19. 通过展频降低系统EMI
  20. 就凭这些,蕴含清华百年历史的《无问西东》唤起了一片赤子之心

热门文章

  1. ACL基本概述与配置
  2. 泛微-采知连文档协作平台:采集、存储、协作更高效智能
  3. 【Redis】面试题总结
  4. Mac苹果电脑如何双系统切换
  5. 终极解码-不错的解码器包
  6. 计算机视觉相关库的整理
  7. POS机钱箱的安装与驱动
  8. Java-小球弹跳问题
  9. Ubuntu 16.04安装iBus中文输入法pinyin及问题
  10. java计算机毕业设计线上投保的设计源码+系统+数据库+lw文档+mybatis+运行部署