前端工程小技巧

如何判断两个参数是否相同

2019-04-08  本文已影响0人  千茉紫依

在函数 (x,y)=>{ console.log(??) }中,比较x,y是否相同

如果参数是字符串,布尔
可以直接使用x===y,例如 :

('a','a')
console.log(x===y);  //true
(true,true)
console.log(x===y);  //true

如果参数是数组,对象
这时使用x===y就可能有问题,因为只有在两个参数指向同一个饮用的时候才会相等。例如:

( [1,2,3] , [1,2,3])
console.log(x===y);  //false  指向的是内存中的两个不同地址
 let m=[1,2,3] 
 let n=m
 ( n , m )
console.log(x===y);  //true  指向的同一个引用

如果对象是通过深复制生成的,这时比较的方法是逐项比较

  let  result = true;
  for (let k in x) {
       if (x[k] != b[k]) {
          result = false;
          break;
      }
 }

如果参数是数字
数字中比较特殊的是NaN和0、-0,如果我们使用x===y,发现结果与我们预料的正好相反。

 ( NaN , NaN )
console.log(x===y);  //false  NaN与NaN居然不相等
 ( 0 , -0 )
console.log(x===y);  //false  0与-0也不相等

这是我们要进一步判断,通过.isNaN函数使他们强制相等

if(Number.isNaN(x)&&Number.isNaN(y)){
       return true
 }  

对于0与-0,js中有正负无穷的概念,1/0=Infinity 、1/-0=-Infinity,所以,当x,y为0时,判断他们的倒数是否相等,即可判断出他们是否相等

( -0 , 0 )
 if(x===0&&y===0){  //这里是隐式转换,-0会被js转换成0进行比较
    return 1/x===1/y   //但是这里x依旧是-0
 }
    //最终实现
     const isEqual = (x, y) => {
           if(typeof x!==typeof y) return false
           if(typeof x!=='object'||typeof y!=='object'){
               if(x==0&&y==0)  return 1/x===1/y  //处理 (0, -0 )的情况
               return x===y
           }else{
              if(x==null||y==null){
                  return x=== y   //处理 (null , { a:NaN }) 的情况
              } 
              let r=true
              for(let key in x){
                  if(x[key]!=y[key]){  
                      //处理 ({ a:NaN } , { a:NaN }) 的情况
                      if(Number.isNaN(x)&&Number.isNaN(y)){
                          r=true
                      }else{
                          r=false 
                      }
                  }else{
                     //处理 ({ a:0 } , { a:-0 }) 的情况
                     if(x[key]==0 && y[key]==0 ){
                        r=(1/x===1/y)
                     }
                  }
              }
               return r
           }
        };
上一篇下一篇

猜你喜欢

热点阅读