为什么 (===) 在比较 2 个对象时返回false。
但是使用其他操作(>、<、+、-、*、/)2 个对象 - 给出所需的结果(即valueOf方法计算出来)
let man = {
name: 'Sergey',
surname: 'Sergeev',
age: 30,
valueOf(){
return this.age;
}
}
let man2 = {
name: 'Ivan',
surname: 'Ivanov',
age: 30,
valueOf(){
return this.age;
}
}
console.log(man === man2)
如果你想比较年龄(并且通常对属性值进行任何操作) - 做起来更容易:
下面解释
valueOf() 方法返回指定对象的原始值。
事实是,此时当您
>, <, +, -, *, /
对对象执行原始操作时,对于每个对象,都会返回每个对象的原始值 - 在您的情况下,您在valueOf
. 并且已经使用返回值执行了操作。当您对对象执行操作
==, ===
时,将比较对对象的引用。但是如果你这样做:当其中一个操作数具有原始值时,那么该对象也将被转换为原始值(当不严格设置时):
两个“相同”的空对象永远不会相等,因为对象总是有引用比较
但是如果比较指向同一个对象的变量(有相同的引用),它会返回
true
有关基元类型转换和对象转换的更多信息:
===
在objects的情况下不强制转换和比较引用。这man
是man2
两个不同的对象——它们不能严格相等。据我所知,使用运算符(>、<、+、-、*、/)比较这两个对象会得到一个数值转换,因为 处理数字的操作。因此你得到了预期的结果。除此之外,还有逻辑和字符串的转换。
===
用于在不进行类型转换的情况下测试是否相等,因此两个不同的对象将不同。要么使用递归对象比较,要么最好将对象表示为字符串并比较它们:JSON.stringify(man1) === JSON.stringify(man2)
。