考虑 代码段
var dog1 = {id : 1, name : "Angus", age: 10};
var dog2 = {id : 1, name : "Angus", age: 10};
alert(dog1 == dog2); // ofcourse, false
alert(dog1.valueOf() == dog2.valueOf()); // ofcourse, false
在现实生活中, dog1 & dog2 将是同一个对象。
回到真实场景,
我最近接手了其他开发人员的项目,为了比较对象,他开发了以下函数来比较2个对象。该项目纯粹是用JavaScript开发的。
f()检查2个对象是否相等 -
function compareObjs(obj1, obj2) {
var compare = function(objA, objB, param) {
var param_objA = objA[param];
var param_objB = (typeof objB[param] === "undefined") ? false : objB[param];
switch(typeof objA[param]) {
case "object": return (compareObjs(param_objA, param_objB));
case "function": return (param_objA.toString() === param_objB.toString());
default: return (param_objA === param_objB);
}
}; // internal compare helper function
for (var parameter_name in obj1)
if (typeof obj2[parameter_name] === "undefined" || !compare(obj1, obj2, parameter_name))
return false;
for (parameter_name in obj2)
if (typeof obj1[parameter_name] === "undefined" || !compare(obj1, obj2, parameter_name))
return false;
return true;
}
var dog1 = {name : "Angus",
bark : { frequency : "low" },
age: 10
};
var dog2 = {name : "Angus",
age: 10,
bark : { frequency : "low" }
};
alert(compareObjs(dog1,dog2)); // true
我对此行感到困惑
case "function": return (param_objA.toString() === param_objB.toString());
为什么检查函数相等,他写了上面的代码?有人可以阐明这一点。这是正确的方法吗?
答案 0 :(得分:2)
你的前任有良好的意图,但不幸的是,仅通过他们的文本来比较这些功能是不够的。您还必须考虑声明函数的环境,因为它可能使用闭包(在函数使用的函数之外定义的变量)。
看看这个例子:
function getOne() {
var x = 1;
return function foo() {
return x;
};
}
function getTwo() {
var x = 2;
return function foo() {
return x;
}
}
var f1 = getOne(),
f2 = getTwo();
console.log(f1 === f2); // false
console.log(f1.toString() === f2.toString()); // true
console.log(f1() === f2()); // false
在示例中,f1
和f2
的函数具有完全相同的字符串表示形式,但是一个在调用时返回1
,另一个返回2
。因此,正确比较函数的唯一方法是通过引用,即f1 === f2
。
答案 1 :(得分:0)
原始作者的想法可能是,如果对象具有相同的功能,它们就是相同的。
这是正确的方法吗?我不知道。对象相等通常有两种有用的方式:作为相同的实例并具有相同的内容/值。这段代码添加了检查相同功能的元素,但我无法真正看到这会有多大帮助。