我一直在使用这样的构造器模式:
function Class(parameter) {
this.id = parameter;
}
let testOne = new Class('a');
let testTwo = new Class('a');
console.log(testOne === testTwo);
console.log(testOne == testTwo);
console.log(testOne.id === testTwo.id);
如您所见,我的第一个console.log(testOne === testTwo)
返回了false
。我认为这与以下事实有关:即使new
构造对象的不同实例具有相同的确切属性,也始终彼此不同。除了直接检查其唯一性和识别性之外,还有另一种方法来检查两个对象是否具有相同的确切属性吗?
答案 0 :(得分:2)
内部js有两种不同的方法来检查相等性, 原语(如字符串)用于值比较和对象(arrays,Date对象) 它可供参考(通过引用进行的比较基本上可以检查到 看看给定的对象是否指向内存中的相同位置。)
这是一种通过值检查对象相等性的方法
function Class(parameter) {
this.id = parameter;
}
let testOne = new Class('a');
let testTwo = new Class('a');
//console.log(testOne === testTwo);//gives false
//console.log(testOne == testTwo); // gives false
//
let testThree=testOne;
console.log(testOne === testThree);//gives true (As they both refer to the same instance in memory now)
/// objects equality by value
function isEquivalent(a, b) {
// Create arrays of property names
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
// If number of properties is different,
// objects are not equivalent
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
// If values of same property are not equal,
// objects are not equivalent
if (a[propName] !== b[propName]) {
return false;
}
}
// If we made it this far, objects
// are considered equivalent
return true;
}
// Outputs: true
console.log(isEquivalent(testOne, testTwo));
如果您觉得该方法又长又复杂,可以尝试使用lodash之类的某些库,该库已内置用于此类任务的函数。
function Class(parameter) {
this.id = parameter;
}
let testOne = new Class('a');
let testTwo = new Class('a');
console.log(_.isEqual(testOne, testTwo));
// => true
console.log(testOne === testTwo);
// => false
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.core.js"></script>
答案 1 :(得分:0)
您可以创建一个比较两个浅层物体的函数。
function Class(parameter) {
this.id = parameter;
}
let testOne = new Class('a');
let testTwo = new Class('a');
function compObj(obj1,obj2){
if(Object.keys(obj1).length !== Object.keys(obj2).length) return false;
for(let key in obj1){
if(obj1[key] !== obj2[key]) return false;
}
return true;
}
console.log(compObj(testOne,testTwo));