javascript - 比较 JavaScript 中的函数与 .toString()

标签 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

在现实生活场景中,dog1dog2 将是同一个对象。

回到真实场景,

我最近从其他开发人员那里接手了这个项目,为了比较对象,他开发了以下函数来比较两个对象。该项目纯粹用 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());

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

最佳答案

您的前任有良好的意图,但不幸的是,仅通过文本来比较功能是不够的。您还必须考虑声明函数的环境,因为它可能使用闭包(在函数使用的函数外部定义的变量)。

看看这个例子:

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

关于javascript - 比较 JavaScript 中的函数与 .toString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32651176/

相关文章:

c# - Enum.ToString 返回错误值?

javascript - 与 Controller 和自定义指令相关的 Angular JS

java - 打印二维数组列表

javascript - 使用 PHP 和 JavaScript 每秒更改图像

javascript - D3.js - "svg:"中的 "svg:rect"是必须的吗?

java - 仅在 @EqualsAndHashCode 和 @ToString 中使用 callsuper 的更好方法?

java - 接口(interface)内的 toString、hashcode 和 equals 方法

arrays - 使用 Thymeleaf 将数组转换为字符串的 null 安全方法是什么

javascript - 可以使用javascript或phonegap以二进制模式从远程服务器读取图像吗?

javascript - PHP 解析 JSON 字符串