Javascript比较2个函数是否完全相同

时间:2018-04-05 03:00:48

标签: javascript function compare this

我遇到了这个问题。需要检查2个功能是否相同或是否相同。 所以场景有点像这样: fn1函数是匿名的。

function fnName(args) {
if(this.fn1 === this.json1.fn1)
//this is true
else
//this is false
}

这里this.fn1和this.json1.fn1指向相同的函数定义。有没有办法找出他们是否指向相同或不同?

我尝试过使用 function.toString(),但这为任何函数提供了相同的输出,即;

function() { [native code] }

并且在这个被比较时,它给出了真实的任何2个函数的输出甚至不相同。

比较 === 它并没有将它们视为相同。在调试时,它显示它指向同一行的函数。

在执行 Object.is(this.fn1,this.json1.fn1); 时返回false,这意味着它们不是同一个对象。

如何将这些函数设置为属性是通过使用绑定函数,如:

fn1 = fn1.bind(this);
json1["fn1"] = fn1.bind(this)

所以现在我们知道这些是两个不同的对象

2 个答案:

答案 0 :(得分:0)

函数是JavaScript中的对象。即使两个完全相同的函数仍然是内存中的两个不同的对象,也永远不会相等。

您所能做的就是将函数转换为字符串并比较字符串。我猜你在比较表达式中并没有实际调用.toString()函数,而是比较了实际的.toString函数代码。



var o1 = {
  foo: function (message){
    console.log(message);
  }
};

var o2 = {
  log: function (message){
    console.log(message);
  }
};

var o3 = {
  log: function (msg){
    console.log(msg);
  }
};

var test = o1.foo;


function compare(f1, f2){
  // You must convert the functions to strings and compare those:
  console.log(f1.toString() === f2.toString());
}

compare(o1.foo, o2.log);  // true - the two functions are identical
compare(o1.foo, o3.log);  // false - the two functions are not identical
compare(o1.foo, test);    // true - the two variables reference the same one function

// This is just to show how not properly calling toString() affects the results:
console.log(o1.foo.toString);   // function toString() { [native code] }
console.log(o1.foo.toString()); // function (message){ console.log(message); }




答案 1 :(得分:0)

考虑以下示例:

var fun1 = function() { console.log('fun1') };
var fun2 = fun1;
var fun3 = fun1.bind({});

console.log(fun1 === fun2); // true
console.log(fun1 === fun3); // false

function test() {
  fun1 = () => { console.log('new function') }
  fun1();
  fun2();
  fun3();
  console.log(fun1 === fun2); // false
}

fun1();
fun2();
fun3();
test();

  • fun3fun1的副本,在比较中返回false
  • fun2fun1是对同一功能的引用。
  • 在内部test()功能,将fun1分配给新功能。但是,fun2仍指向旧函数,因此在比较它时会返回false。

因此,使用===比较2个函数引用是安全的。