当前位置: 代码迷 >> 综合 >> Vue源码中的对象相等比较
  详细解决方案

Vue源码中的对象相等比较

热度:2   发布时间:2024-02-19 18:45:00.0

Vue源码中的对象比较函数写的极为经典漂亮,在此进行部分注释并添加一个函数类型比较判断,代码如下:

function isObject(o) {return typeof o==='object'}function isFunction(o) {return typeof o==='function'}function looseEqual(a,b) {//如果a和b都是值类型,可以直接判断是否相等if(a===b) return true;const isObjectA=isObject(a)const isObjectB=isObject(b)if(isObjectA&&isObjectB){//如果都是对象try{const isArrayA=Array.isArray(a)const isArrayB=Array.isArray(b)if(isArrayA&&isArrayB){//如果都是数组return a.length===b.length&&a.every((e,i)=>{return looseEqual(e,b[i])})}else if(a instanceof Date&&b instanceof Date){return a.getTime===b.getTime() //单独处理Date类型,时间戳应当一致}else if(isFunction(a)&&isFunction(b)){return String(a)===String(b) //如果是函数,则直接返回函数定义式是否一致,当然此处是极简判断,因为转换成字符串会将注释也包含其中}else if(!isArrayA&&!isArrayB){const keysA=Object.keys(a)const keysB=Object.keys(b)//先判断key的长度,再判断a包含于breturn keysA.length===keysB.length&&keysA.every(key=>{return looseEqual(a[key],b[key])})}else {return false}}catch (e) {return false}}else if(!isObjectA&&!isObjectB){return String(a) === String(b)}else {return false //对应数据类型不一致,直接返回否}}

面试中也经常会问到类似此问题,需留心学习大神的代码风格及逻辑,受益匪浅

  相关解决方案