今回のケースは、true
になることはありえません。
比較ができない理由に関しては、maisumakunさんのご回答通りですが、
関数ではなく、他のオブジェクトも同様に、今回のように、オブジェクトの代入ではなく、新たな値としての変数宣言では、比較した時偽となります。
javascript
1const a = {val: 25, text: 'hoge'};
2const b = {val: 25, text: 'hoge'};
3
4console.log(a == b); // false
これは、たとえオブジェクトの中身が同じ内容であったとしても、
b
が宣言された時点で、新しいオブジェクトがメモリに保持され、b
は、その新しいオブジェクトの参照となるからです。
つまり、a
とb
は本質的には別物になってしまうわけです。
これは実はプリミティブの値であっても同様のことが起きています。
javascript
1const a = 25;
2const b = 25;
3
4// 値自体は同じでも、aとbは別の25を参照している
ただし、プリミティブ値の場合は、オブジェクトと違い、
比較演算時は値自体を評価するため、
javascript
1console.log(a == b); // true
となります。
ここら辺は、参照について勉強されると、理解が深まるかと思います。
なので、今回のように関数の中身自体を比較するには、
そのままでやるならば、
比較時に、JSON文字列化して、文字列で比較をし、無理やり行うか、
関数オブジェクトの各プロパティが同じであり、値も同じと、再帰的に潜って比較、
などしていくしかないかと。