初めての投稿です。
現在、初心者でjavascriptの学習をしています。
関数について疑問に感じたことがあります。
それは、数値を引数にすることは可能ですが、引数に演算子を入れるにはどのようにすればよいのかということです。
function keisan(hugou){
return 3 hugou 5;
}
hugouに、+や-、*や/を入れた、このような計算を行いたいと考えています。
解決策はございますでしょうか?
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア2468
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
総合スコア69458
0
ベストアンサー
引数に演算子を入れることは出来ません。
eval
や Function
で演算子となる 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総合スコア18166
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/05 14:41
2016/04/05 14:48
2016/04/05 14:51
2016/04/05 15:52
2016/04/06 13:58
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
総合スコア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
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。