在函数 (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
}
};
网友评论