JavaScript中的函数相等性

4
JS引擎如何实际比较对象(例如函数声明)的相等性?
var f1 = function(){};
var f2 = function(){};

console.log(f1 === f2);  //false

实际上在幕后是怎样确定对象引用不同的?它是比较内存位置吗?


2
如果你不会期望 new Object() === new Object(),那为什么你会期望 new Function() === new Function() 呢? - zzzzBov
刚看到你的编辑。简而言之,是在比较内存位置。 - Mike
3个回答

5

函数是对象。
不同实例的对象永远不会严格相等(或非严格相等)。

通过指针应用严格相等:

var a = b = {}, c = {};
console.log(a === b, a === c); // true false

2
它们也从未非严格相等。 - Pointy
@Pointy,我只是不确定类似于toString的方法,但似乎是真的。=) - vp_arth

2
var foo = function() {
    a = 1;
 }; 

 var bar = function() {
    a = 1;
 }; 

alert(foo.toString() == bar.toString());​

这将返回真。


2
是的,但您只是比较已翻译的“字符串”值而不是实际对象本身。 - Mike
@Mike是正确的。这与OP的问题无关。 - rgoliveira
1
此外,您可以通过删除对全局变量a的赋值来优化您的代码。 - vp_arth
嗯,目前我明白这里的答案了。它只是展示了一种棘手(并且不总是正确)的比较函数代码的方式。在某些情况下,foo.toString().replace(/\s+/g, ' ')可能更好。 - vp_arth
@Mike 是的,我已经比较了字符串值。两个对象存储在两个不同的位置。因此,当我们尝试进行比较时,实际上是在尝试比较两个不同的内存位置,这些位置总是不同的。 只有当它们指向相同的位置时,结果才会为true。 ` var foo = function() { a = 1; }; var bar = foo; alert( foo == bar )` - pranav-dev
当然,但这不是 OP 所问的。 - Mike

-4

== 检查是否相等

=== 检查是否相等,同时检查变量类型或返回类型


1
在Javascript中,函数没有参数和返回类型。 - Paul Stelian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接