初めての投稿です。
現在、初心者でjavascriptの学習をしています。
関数について疑問に感じたことがあります。
それは、数値を引数にすることは可能ですが、引数に演算子を入れるにはどのようにすればよいのかということです。
function keisan(hugou){
return 3 hugou 5;
}
hugouに、+や-、*や/を入れた、このような計算を行いたいと考えています。
解決策はございますでしょうか?
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+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('+'));
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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 さん
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+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 );
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
think49
2016/04/06 00:54
JAR は Java であって JavaScript とは別物です。元々のタグが JavaScript であった事から、寄せられた回答は全て JavaScript コードになります。