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

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

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

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Q&A

解決済

5回答

1153閲覧

演算子を計算に使用するためには

yusi

総合スコア10

JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

0グッド

0クリップ

投稿2016/04/05 14:17

編集2016/04/05 15:01

初めての投稿です。
現在、初心者でjavascriptの学習をしています。

関数について疑問に感じたことがあります。
それは、数値を引数にすることは可能ですが、引数に演算子を入れるにはどのようにすればよいのかということです。

function keisan(hugou){
return 3 hugou 5;
}

hugouに、+や-、*や/を入れた、このような計算を行いたいと考えています。

解決策はございますでしょうか?

よろしくお願いいたします。

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

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

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

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

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

think49

2016/04/05 15:54

JAR は Java であって JavaScript とは別物です。元々のタグが JavaScript であった事から、寄せられた回答は全て JavaScript コードになります。
guest

回答5

0

JavaScript では演算子を単独で扱うことはできませんので、関数の引数に渡すこともできません。ただし、関数の引数に関数を渡すことはできるので、次のようなことはできます。

javascript

1function minus(x, y) { 2 return x - y; 3} 4 5function plus(x, y) { 6 return x + y; 7} 8 9function exec(func) { 10 return func(3, 5); 11} 12 13console.log(exec(minus)); 14console.log(exec(plus));

これでやりたいことは実現できるでしょうか。

ちなみに eval() を使えば、次のようなことも可能ですが、絶対にやってはいけません。

javascript

1function dameZettai(ope) { 2 return eval('3' + ope + '5'); 3} 4 5console.log(dameZettai('-')); 6console.log(dameZettai('+'));

投稿2016/04/05 14:31

unau

総合スコア2468

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

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

yusi

2016/04/05 14:37

unauさん、ありがとうございます。 eval()は、なぜ絶対にやってはいけないのでしょうか?
unau

2016/04/05 18:29

まずはひととおり、ご自身で調べることをおすすめします。そして、その危険性が理解できないうちは使わないでください。
yusi

2016/04/06 13:57

わかりました。ありがとうございます。
guest

0

JavaScriptの変数に演算子は入りません。

【JavaScriptの変数と型、値 - Qiita】
http://qiita.com/rf141/items/ff1fa4741e4cd612b128

「引数に演算子を入れる」と同様のことは、関数で行えます。

JavaScript

1function keisan( hugou ){ 2 return hugou( 3, 5 ); 3} 4 5// 書き方1 6var tmp1 = keisan( function( a, b ) { return a + b; } ); 7 8// 書き方2 9function puls( a, b ) { 10 return a + b; 11} 12var tmp2 = keisan( puls );

投稿2016/04/05 14:41

kei344

総合スコア69458

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

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

yusi

2016/04/05 14:42

keiさんありがとうございます。 変数に演算子は入らないんですね。。。
guest

0

ベストアンサー

引数に演算子を入れることは出来ません。
evalFunction で演算子となる String 値を与える事で似たような事が出来ますが、任意のコードを実行できてしまいます。
というわけで、自前で演算子を解釈するコーディングがお勧めです。

JavaScript

1function calc (arithmeticOperator) { 2 switch (String(arithmeticOperator)) { 3 case '+': 4 return 3 + 5; 5 case '-': 6 return 3 - 5; 7 case '*': 8 return 3 * 5; 9 case '/': 10 return 3 / 5; 11 } 12} 13 14console.log(calc('+')); // 8 15console.log(calc('-')); // -2 16console.log(calc('*')); // 15 17console.log(calc('/')); // 0.6

Re: yusi さん

投稿2016/04/05 14:31

編集2016/04/05 14:44
think49

総合スコア18166

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

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

yusi

2016/04/05 14:41

think49さん、ありがとうございます。 このように作れば、意図した通りに動かすことが可能なのですね。 本当にありがとうございます。
think49

2016/04/05 14:48

String 型以外を引数にとった場合の処理が甘かったので修正しました。 個人的にはこういう文法を文字列値に持ってくる実装は嫌いではありませんし、有りだと思います。 Selectors API, XPath のように特定の文法に沿った文字列を引数に取る関数は前例があります。 (その為に文法に矛盾が出てはいけないのでアルゴリズムはしっかりと考えておく必要はあります。)
yusi

2016/04/05 14:51

長い時間考えていたにもかかわらずこのようなアルゴリズムを導き出すこともできませんでした。 もしよろしければthink49は、どのようにして導いたか聞かせていただきたです。
think49

2016/04/05 15:52

正直なところ、深く考えずにコードを書いていたので考えに至った経緯を尋ねられると答えづらいのですが…。 CSVパーサやXPathの簡易パーサを書いていた事から文字列で演算子を受け取る発想に至りやすかったのかもしれません。 文字列フォーマットはいろいろとあるのでそれらのパーサ(解析器)を書いてみるのも勉強になると思います。 本コードの延長線上でいえば、'-1.3+5.1' や '2.4 / 2' を解析して結果を求めるコードを考えてみるのも面白いかもしれませんね。
yusi

2016/04/06 13:58

そうなのですね。 少し深く掘って考えてみたいと思います。 ありがとうございました。
guest

0

あえて eval() をつかってみました。

javascript

1function keisan(op, a, b) { 2 if (op == '+' || op == '-' || op == "*" || op == "/") { 3 return eval("" + parseInt(a) + op + parseInt(b)); 4 } else { 5 throw "Illegal op:" + op; 6 } 7} 8 9console.log("2 + 3 = " + keisan("+", 2, 3)); 10console.log("2 * 3 = " + keisan("*", 2, 3)); 11console.log("echo * 3 = " + keisan("*", "echo", 3)); 12console.log("2 echo 3 = " + keisan("echo", 2, 3));

実行例

$ node 1.js 2 + 3 = 5 2 * 3 = 6 echo * 3 = NaN /private/tmp/1.js:5 throw "Illegal op:" + op; ^ Illegal op:echo

得体のしれない引数を使って eval() するのは危険ですが、
限定した引数に対してだけ適用する
のは有りなのではないでしょうか?

投稿2016/04/06 13:56

katoy

総合スコア22324

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

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

0

解決済みのようですが、javascriptには関数を変数として定義することができます。
この機能は、今回の場合では冗長で回りくどいのですがjavascriptの特徴的な機能の一つなので、
是非とも覚えてほしいと思います、

javascript

1function shiki(hugou){ 2 if(hugou == '+') return function(a, b){return a + b;}; 3 if(hugou == '-') return function(a, b){return a - b;}; 4 if(hugou == '*') return function(a, b){return a * b;}; 5 if(hugou == '/') return function(a, b){return a / b;}; 6 return function(a, b){return undefined;}; 7} 8 9function keisan(hugou){ 10 var f = shiki(hugou) 11 return f(3, 5); 12}

関数keisanは"符号"を受け取り、関数shikiに"符号"を渡すことで"計算式"を受け取り計算を実行しています。
javasciptでは、関数を変数に代入できるのでvar f = shiki('hugou');のような書き方ができます。

何かと便利な書き方なので紹介まで。

投稿2016/04/06 00:41

iwamoto_takaaki

総合スコア2883

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問