美文网首页前端工程小技巧
如何判断两个参数是否相同

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

作者: 千茉紫依 | 来源:发表于2019-04-08 10:01 被阅读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
               }
            };
    

    相关文章

      网友评论

        本文标题:如何判断两个参数是否相同

        本文链接:https://www.haomeiwen.com/subject/uygyiqtx.html