JavaScript比较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)

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

函数是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); }

考虑以下示例:

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个使用===的功能参考。

相关内容

  • 没有找到相关文章

最新更新