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

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

ただいまの
回答率

88.33%

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 941

yusi

score 10

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • think49

    2016/04/06 00:54

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

    キャンセル

回答 5

+2

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

function minus(x, y) {
  return x - y;
}

function plus(x, y) {
  return x + y;
}

function exec(func) {
  return func(3, 5);
}

console.log(exec(minus));
console.log(exec(plus));


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

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

function dameZettai(ope) {
  return eval('3' + ope + '5'); 
}

console.log(dameZettai('-'));
console.log(dameZettai('+'));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 23:37

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

    キャンセル

  • 2016/04/06 03:29

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

    キャンセル

  • 2016/04/06 22:57

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

    キャンセル

checkベストアンサー

+1

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

function calc (arithmeticOperator) {
  switch (String(arithmeticOperator)) {
    case '+':
      return 3 + 5;
    case '-':
      return 3 - 5;
    case '*':
      return 3 * 5;
    case '/':
      return 3 / 5;
  }
}

console.log(calc('+')); // 8
console.log(calc('-')); // -2
console.log(calc('*')); // 15
console.log(calc('/')); // 0.6

Re: yusi さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 23:51

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

    キャンセル

  • 2016/04/06 00:52

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

    キャンセル

  • 2016/04/06 22:58

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

    キャンセル

+1

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

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

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

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

// 書き方1
var tmp1 = keisan( function( a, b ) { return a + b; } );

// 書き方2
function puls( a, b ) {
    return a + b;
}
var tmp2 = keisan( puls );

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 23:42

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

    キャンセル

0

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

function shiki(hugou){
    if(hugou == '+') return function(a, b){return a + b;};
    if(hugou == '-') return function(a, b){return a - b;};
    if(hugou == '*') return function(a, b){return a * b;};
    if(hugou == '/') return function(a, b){return a / b;};
    return function(a, b){return undefined;};
}

function keisan(hugou){
    var f = shiki(hugou)
    return f(3, 5);
}


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

function keisan(op, a, b) {
  if (op == '+' || op == '-' || op == "*" || op == "/") {
    return eval("" + parseInt(a) + op + parseInt(b));
  } else {
    throw "Illegal op:" + op;
  }
}

console.log("2 + 3 = " + keisan("+", 2, 3));
console.log("2 * 3 = " + keisan("*", 2, 3));
console.log("echo * 3 = " + keisan("*", "echo", 3));
console.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() するのは危険ですが、
  限定した引数に対してだけ適用する
のは有りなのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る