28

bar と foo が等しいかどうかをテストするにはどうすればよいでしょうか?

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

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

 if (foo === bar) alert('baz');
 if (foo == bar) alert('qux');

上記の条件は両方とも false です。

更新 - 関数の等価性をテストする必要がある理由を要求されました

パブリッシュ/サブスクライブ フレームワークを構築しており、トピックのサブスクライブを解除するためにコールバックを渡す必要があります。

フィドルを参照してください: http://jsfiddle.net/jamiefearon/hecMS/47/

4

7 に答える 7

36

2 つの関数を呼び出した結果を比較することで、2 つの関数の内容がまったくtoString同じかどうかを確認できます。

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

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

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

ただし、異なる文字が 1 つしかない場合は失敗します。一方、2 つの関数が同じことを行うかどうかを確認することは、ほとんど不可能です

于 2012-08-31T13:44:26.853 に答える
23

問題は、関数の等価性についてさまざまな概念があることです。

  • 参照等価。関数はメモリのどこかに格納され、特定のアドレスから開始されます。2 つの関数名 (本質的には内部のアドレス)trueの場合、両方の名前が同じアドレスを指している場合、参照の等価性が得られます。いつ割り当てるかは問題ですbar = foo。参照等価は JavaScript で使用されます。
  • 別の回答で提案されているソースコードの平等。関数本体の文字を変更すると機能しません。また、toSourceW3C 標準化されていないため、現在 (2014 年現在) Firefox でのみ使用できます。
  • ソース コードの構文上の等価性。抽象構文ツリーを使用して、スペースやコメントの変更を防ぐことができます。ラムダ計算で定義されているように、アルファ等価 (つまり、変数の名前が一貫して変更される関数の等価) を使用できますが、
  • 関数が同じように機能する場合、関数が等しい場合の拡張等価性。関数の拡張等価性をチェックするアルゴリズムがないという定理があるため、探しているものではないことは確かです。ただし、JS よりも高度な言語には、
  • Intensional equality (関数が等しいことを手動で証明するか、プログラムがコンパイルされない場合) および
  • 観測的等価性 (これは説明するにはあまりにも高度です)。

ですから、平等とは何かを大事にしてください。

于 2014-02-10T14:38:22.670 に答える
3

2つの変数がまったく同じ関数オブジェクトを参照しているかどうかをテストしたり、関数を文字列に変換して実際にまったく同じかどうかを確認したりできますが、2つの関数がまったく同じことを行うかどうかを判断するのは少し難しいでしょう。より難しい、または多分もっと難しい。

ミニファイアはかなりの量の静的分析を行うため、ミニファイアを介して関数のペアを実行することは興味深いでしょう。

于 2012-08-31T13:41:07.923 に答える
3

イベントのNode.jsソースを見ると

https://github.com/nodejs/node/blob/master/lib/events.js

===コア チームが関数の等価性を比較するために使用していることがわかります。

が関数に対してどのように実装されているかはわかりませんが、2 つの異なる関数が同じ結果になる可能性があるため、===そうでないことを願っています。toString()toString()

于 2016-02-26T22:05:40.653 に答える
1

この機能が必要な場合は、プログラムを少し再構築したほうがよいようです。このようなものはうまくいくかもしれません:

function baz(myInt) { return 3 + myInt; }
function asd(a) { return 3 + a; }

var foo = baz;
foo(1); //returns 4

var bar = baz;
bar(3); //returns 6

foo === bar; //true

bar = asd;
bar(3); //returns 6

foo === bar; //false
于 2012-08-31T13:43:24.950 に答える
0

基本的に、一般的には不可能です。JavaScript で機能的同等性をテストする方法はありません。あなたが得ることができる最も近いものは、それらのコードを文字列として比較して等しいかどうかです。

于 2012-08-31T13:43:13.420 に答える