@panhonhang
2018-07-19T10:10:16.000000Z
字数 1192
阅读 550
在js中的相等运算符包括"==","==="。
"==":两边值类型不同的时候,要先进行类型转换,再比较 ;
"===":不做类型转换,类型不同的一定不等。
这是基本的数据类型相等判断。
两个对象是否相等如何判断呢?
也许你会认为:“如果两个对象有相同的属性,以及它们的属性有相同的值,那么这两个对象就相等。”
请看下面这个例子:
var obj1 = {
name: "李华",
sex : "男"
}
var obj2 = {
name: "李华",
sex : "男"
}
console.log(obj1 == obj2);//输出: false
console.log(obj1 === obj2);//输出: false
为什么会出现这种情况呢?主要原因是基本类型(string,number)通过值来比较,而对象(Date,Array)及普通对象通过指针指向的内存中的地址来做比较。上述例子中obj1与obj2指向内存中的地址并不相同。如果改为下面这样:
var obj1 = {
name: "李华",
sex : "男"
}
var obj3 = obj1;
console.log(obj1 == obj3);//输出: true
这样的话会返回true,这是因为obj1和ob3的指针指向了内存中的同一个地址。
判断两个对象是否相等,你需要明确,你是想判断两个对象的属性相同,还是属性对应的值相同?
如果想要判断对象的值是否相等,你可以通过遍历对象的每个属性,看看它们是否相等。
function isObjectValueEqual(a, b) {
var aObj = Object.getOwnPropertyNames(a);
var bObj = Object.getOwnPropertyNames(b);
if (aObj.length != bObj.length) {
return false;
}
for (var i = 0; i < aObj.length; i++) {
var propName = aObj[i];
if (a[propName] !== b[propName]) {
return false;
}
}
return true;
}
var obj1 = {
name: "李华",
sex : "男"
}
var obj2 = {
name: "李华",
sex : "男"
}
console.log(isObjectValueEqual(obj1, obj2));//输出true
但是这种方法在许多情况下都不能处理。比如:
- 如果该属性值之一本身就是一个对象
- 如果属性值中的一个是NaN
- 如果一个属性的值为undefined,而另一个对象没有这个属性
在Underscore和Lo-Dash有一个名为_.isEqual()方法,可以处理深度对象的比较。
var obj1 = {
name: "李华",
sex : "男"
}
var obj2 = {
name: "李华",
sex : "男"
}
console.log(_.isEqual(obj1, obj2));//输出true