在JavaScript中将函数与.toString()进行比较

时间:2015-09-18 11:41:47

标签: javascript tostring

考虑 代码段

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());

为什么检查函数相等,他写了上面的代码?有人可以阐明这一点。这是正确的方法吗?

2 个答案:

答案 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

在示例中,f1f2的函数具有完全相同的字符串表示形式,但是一个在调用时返回1,另一个返回2。因此,正确比较函数的唯一方法是通过引用,即f1 === f2

答案 1 :(得分:0)

原始作者的想法可能是,如果对象具有相同的功能,它们就是相同的。

这是正确的方法吗?我不知道。对象相等通常有两种有用的方式:作为相同的实例并具有相同的内容/值。这段代码添加了检查相同功能的元素,但我无法真正看到这会有多大帮助。