質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

4回答

781閲覧

JavaScriptで関数の処理の比較

beginner1212

総合スコア4

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/04/13 05:11

JavaScriptについて質問をさせてください。
関数の中身(処理)自体の比較をしたいのですがどのように記述すればよいのかがわかりません。

該当のソースコード

JavaScript

1var a = function(){ var c = 1 + 1;}; 2var b = function(){ var c = 1 + 1;}; 3console.log( a === b ); 4//結果... true 5//↑このように関数の中身を比較したい

補足情報

もちろん比較演算子がこのような機能を持っていないことは理解していますし、
オブジェクト指向である言語でこのような事をしてもよいか考えましたが、
勉強の為にもJavaScriptでどこまでできるのかが気になり質問させていただきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2020/04/13 05:14

(質問文は編集できます)「比較したい」について、「何のために」「どういう処理がしたくて」の部分を質問文に追記してください。
guest

回答4

0

関数の中身(処理)自体の比較をしたいのですがどのように記述すればよいのかがわかりません。

汎用的に実行可能な方法は、言語を問わず原理的に存在しないことが証明されています。

「停止性問題」といって、「関数が必ず停止する」かどうかを、どのような関数についても有限の時間内に正しく判定する方法が存在しないことが知られています。よって、「止まるかどうかわからない関数」と「ただ無限ループして永遠に停止しない関数」を比較しても結果が得られない、という結論になります。

投稿2020/04/13 05:18

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こういう事なのか解りませんが、
ソースコードを文字列として比較なら、

処理系依存になりますが。Chromeの JavaScript (node)

js

1 2var a = function(){ var c = 1 + 1;}; 3var b = function(){ var c = 1 + 1;}; 4 5console.log(a.toString() == b.toString()); 6 7// 但し、宣言の仕方によっては変わります。必要に応じて整形する。 8 9function c(){ var c = 1 + 1;}; 10 11console.log(c.toString()); // => "function c(){return 1 + 1;}; 12

組み込み型のメソッドには使えない等、制限はあります。
FireFox には、整形済みのソースを返すtoSource()メソッドもあるそうです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/toSource

投稿2020/04/13 06:10

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

jsはオブジェクトは参照渡しのような挙動をしますが
完全に同じものを参照しているだけなので比較をするとtrueになります
同じことをやっていても参照先が違えば比較はfalseになります

投稿2020/04/13 05:31

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/04/13 05:32

var a = function(){ return function(){var c = 1 + 1;}}; var b = a; var c = a; console.log( b === c ); //true var a = function(){ return function(){var c = 1 + 1;}}; var b = a(); var c = a(); console.log( b === c ); //false
guest

0

今回のケースは、trueになることはありえません。
比較ができない理由に関しては、maisumakunさんのご回答通りですが、
関数ではなく、他のオブジェクトも同様に、今回のように、オブジェクトの代入ではなく、新たな値としての変数宣言では、比較した時となります。

javascript

1const a = {val: 25, text: 'hoge'}; 2const b = {val: 25, text: 'hoge'}; 3 4console.log(a == b); // false

これは、たとえオブジェクトの中身が同じ内容であったとしても、
bが宣言された時点で、新しいオブジェクトがメモリに保持され、bは、その新しいオブジェクトの参照となるからです。
つまり、abは本質的には別物になってしまうわけです。
これは実はプリミティブの値であっても同様のことが起きています。

javascript

1const a = 25; 2const b = 25; 3 4// 値自体は同じでも、aとbは別の25を参照している

ただし、プリミティブ値の場合は、オブジェクトと違い、
比較演算時は値自体を評価するため、

javascript

1console.log(a == b); // true

となります。

ここら辺は、参照について勉強されると、理解が深まるかと思います。

なので、今回のように関数の中身自体を比較するには、
そのままでやるならば、
比較時に、JSON文字列化して、文字列で比較をし、無理やり行うか、
関数オブジェクトの各プロパティが同じであり、値も同じと、再帰的に潜って比較、
などしていくしかないかと。

投稿2020/04/13 05:51

miyabi_takatsuk

総合スコア9555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問