ある数値計算をするプログラムを作っています

そのプログラムではeval()を使っています


某書籍や色々javariptを勉強しているサイトを参考にさせていただいてますが
そこではeval()はあんまり使うなとか、普通は使わないとか書かれていました
多用すると動作が重くなるとか、危険だから何とか…


しかし、自分が作成しているプログラムではevalがどうしても必要となってしまいます
簡単なプログラム例です

function tas(){
gk=0
~~~~省略~~~~
gk=eval(a.value)+eval(b.value);

aとbに数字を入力して足し算の答えをを出力するプログラムの一部です
(この時、答えの出力先はプログラムを端折っていますが用意されています)

a=1 b=2に入力したとして
この時eval()を使わずa(b).valueのみにすると
答えが12と連なって表示されてしまいます

ただこの理由は自分でも解っています
そしてこれを数値として取得し計算させるためにはeval()が必要となってしまいます
現状、自分の知識と経験では…

もしeval()を使わずに数値を取得し計算する方法があれば教えて下さい

このQ&Aに関連する最新のQ&A

とは SID」に関するQ&A: SIDとは?

A 回答 (3件)

evalは文字列をjavascriptの式として評価するからコストが大きいということですかね。



parseInt(a.value)   整数型
parseFloat(a.value)  浮動小数点型
を使うか、a.value-0 して暗黙の型変換を行わせるか、かな。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
勉強になります

お礼日時:2011/04/13 00:04

parseIntとか使えませんか?



http://www.24w.jp/study_contents.php?bid=javascr …
    • good
    • 0
この回答へのお礼

回答ありがとうございます
勉強になります

お礼日時:2011/04/13 00:04

この質問も、よう わからん。



>ただこの理由は自分でも解っています

わかってるなら、違うやり方でやっていると思うが・・・

>eval()はあんまり使うなとか、普通は使わないとか書かれていました

これは、だれが言ったのでしょう。そんな文献みたことありません。よくエセ達人が、ブログなどに書いてありますが、エセであることは明白。

よく習いたての人にたいしては、公式のような感じで、教える人がいるが、へたな人は、表現方法(ボキャブラリー)が乏しいだけ。

たくさん人の作ったの見れば、あ、なるほどこんな手があったか、て気がつくもの。まあ、頭の柔軟性て やつですね(気がつく頭が無いと気がつきませんがね。よくこれ何やっているのかわからない。なんて投稿している人がいるが、そのような人は向いていないんだよなあ。才能が無いと言う事。さっさと違う道にいかないと)。

わかっていないから、

>eval()が必要となってしまいます

といいはっているだけ。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q電卓の便利な使い方について質問です。

電卓の便利な使い方について質問です。

例えば、
1456+525 や
3657+525

のようにA+Bの単純な足し算で、いつもBに同じ数を足していく計算をひたすら仕事上(事務職なので)でよくします。

そこで、このような計算の時の、便利な電卓の使い方があれば、教えてください。

Aベストアンサー

電卓のメーカによって若干変わりますが、

CASIO製の電卓ならば、あらかじめ 525 を入力して プラスを 2回押す(表示のどこかに K の表示が出る)
加える数字を入力してイコールを押す(答えが表示される)
続いて加える数字を入力してイコールを押す(答えが表示される)
 525++1455=(答え表示)
 3657=(答え表示)

 引き算 1455-525、3657-525 (525--1455=3657=)
 かけ算 1455×525、3657×525 (525××1455=3657=)
 割り算 1455÷525、3657÷525 (525÷÷1455=3657=)
でも同様な操作が可能です。

CANON製の電卓は、同様なことが可能ですがキー操作が
 1455++525=(答え表示)
 3657=(答え表示)
になります。

この機能のない機種もありますから、まずは可能かどうかを試すことをお奨めします。

Qevalで数値に変換してる筈なのですが・・・NaN

今、JavaScriptを勉強中なのですが…
Nanと言う表示が出てしまうと言う事は数値じゃないと言う事ですよね?
どうしても一人の力では脱出できませんのでお助けください!
どなたか是非ご教授よろしくお願いします。

var item=["N-01ネックレス","N-02ネックレス","EA-01イヤリング","KS-01携帯ストラップ"];
var g=[10,15,20,30];
var p=[1000,800,600,600];

function n01(){
vargtotal=0;
varguram=0;
for(a=0;a<4;a++)
{
if(document.form.elements[a].checked){
document.form.elements[11+(a*3)].value=item[a];
guram=eval(document.form.elements[12+(a*3)].value=g[a]);
price=eval(document.form.elements[13+(a*3)].value=p[a]);


}else{
document.form.elements[11+(a*3)].value="";
guram=eval(document.form.elements[12+(a*3)].value=0);
price=eval(document.form.elements[13+(a*3)].value=0);
}
gtotal=gtotal+guram[a];
}
document.form.elements[23].value=gtotal;
}

今、JavaScriptを勉強中なのですが…
Nanと言う表示が出てしまうと言う事は数値じゃないと言う事ですよね?
どうしても一人の力では脱出できませんのでお助けください!
どなたか是非ご教授よろしくお願いします。

var item=["N-01ネックレス","N-02ネックレス","EA-01イヤリング","KS-01携帯ストラップ"];
var g=[10,15,20,30];
var p=[1000,800,600,600];

function n01(){
vargtotal=0;
varguram=0;
for(a=0;a<4;a++)
{
if(document.form.elements[a].checked){
document.form.elements[11+(a*3...続きを読む

Aベストアンサー

はじめの方で、itemとgとpという名前の配列を定義しようとしているようですが、JavaScriptで配列を作成するのであれば、

var g= new Array(10,15,20,30);

のように記述するのが普通だと思います。
また、下の方で

gtotal=gtotal+guram[a];

となっていますが、guram()という名前の配列は定義されているのでしょうか?

このあたりに原因があるような気がしますが、いかがでしょう。
見当違いでしたら、ごめんなさい。

QWindowsの電卓の使い方を教えて下さい。

windowsのアクセサリの中に入っている、電卓の使い方が
詳しく書いてあるサイトをご存知の方、教えて下さい。

BACKとCとMRとM+はわかるのですが
その他の使い方がわかりません。

宜しくお願いします。

Aベストアンサー

以下のサイトはどうでしょうか?
http://asugi23.web.infoseek.co.jp/bigc/big54.htm#2
http://allabout.co.jp/computer/windows/closeup/CU20020424A/index3.htm
他、検索サイトで「Windowsの電卓の使い方」で検索すれば、たくさんヒットします。

Qevalの計算結果について

OSはWindows、ブラウザはIE4.0です。
以下のJavaScriptを実行すると、答えとして0.1を期待しているのですが、
s=0.09999999999999964
となります。どうしたら期待通りの答えがでるのでしょうか。
よろしく御回答お願いいたします。

<script language="JavaScript"><!-- スクリプト開始
s=eval("10.18-10.08");
document.write("s="+s);
// スクリプト終了。 --></script>

Aベストアンサー

原因は ykc さんが書かれた通り。

計算上の誤差はあまり気にせずに、体裁を整えたいだけであれば、
参照URLに示したところに、javascript で使える printf() の
コードがあるので、それを使うと良いかも。

参考URL:http://www.goice.co.jp/member/mo/amuse/javascript/expert/

Qipone6sに搭載されてる関数電卓の使い方を教えて下さい。 計算例を書いて頂ければ、嬉しいです。

ipone6sに搭載されてる関数電卓の使い方を教えて下さい。
計算例を書いて頂ければ、嬉しいです。

Aベストアンサー

分かりやすい数字を入れて計算してみればいい。
[2][x²]
とか、
[2][×][π][sin]
とか、結果は分かるでしょ。

Q二択質問作ってその成績表を横の棒グラフで作りたい

二択の質問表をまず作り、その正解率の横棒グラフを作りたいのです。
少しややこしいのですが、その際に、登録制にして、登録してくれた方のみにIDを発行して成績表を作りたいのです。さらに、登録したい方からメールをもらって、その登録用の返事メールも成績表の更新も全自動ですませれるようにしたいのですが、初心者のためどうしていいかわかりません。javascriptを使ってできるのはわかるのですが、具体的にどうすればいいか教えていただけませんでしょうか?お願いします。

Aベストアンサー

こんにちわ、"初心者"を強調せずとも分かっていますので…。


苦戦されているようですね。。。

名前の書き込みとベスト10ということですが、
サーバサイドのプログラムを使わないなら
こんなカンジになってしまうでしょう。

▼ローカルPC側
・質問の画面を見る
・名前を入力する(HTML or JavaScript)
・質問に答える(HTML or JavaScript)
・[採点]ボタンなどが押されたら採点する(JavaScript)
・採点結果と名前をメールであなた宛に送信する(JavaScript)
・今の質問の採点結果のみをグラフ化して見せる(JavaScript+HTML)

▼kuratakuraさんがやること
・メールを見てkuratakuraさんが登録・集計する(集計結果はエクセルなどにまとめる)
・集計結果からベスト10表示グラフ画面をkuratakuraさんが用意する(表現方法は色々)

▼ローカルPC側
・後日ベスト10のグラフを見に来る

上記に加えて、各処理で画面の移動を考えるならCookieの扱い方も勉強しないといけません。
(参考URLにクッキー入門っぽいページを張っておきました)

もう一度書きますが、「JavaScriptはローカルで動作」するものです。
これはサーバに置いてあるデータを書き換えることが出来ないことも示します。
(出来ちゃったらセキュリティ面で大問題です)

つまり成績データを残すことが出来ません。
これを考えればベスト10を求めることは出来ないと分かるはずです。

kuratakuraさんがやることという部分は
私ならサーバサイドの言語で作りたい部分です。

良い機会だと思うのでサーバサイドの言語、始めてみてはいかがですか?


▼前回の補足
前回書き忘れましたがグラフの表現方法の例として
適当な大きさの画像を用意してJavaScriptでwidth属性値を
操作してあげれば出来ます。

<img src="graph.gif" width="[ここを正解率にするとか]">

がんばってください。では。
|・x・)ノ

参考URL:http://www.tohoho-web.com/wwwcook.htm

こんにちわ、"初心者"を強調せずとも分かっていますので…。


苦戦されているようですね。。。

名前の書き込みとベスト10ということですが、
サーバサイドのプログラムを使わないなら
こんなカンジになってしまうでしょう。

▼ローカルPC側
・質問の画面を見る
・名前を入力する(HTML or JavaScript)
・質問に答える(HTML or JavaScript)
・[採点]ボタンなどが押されたら採点する(JavaScript)
・採点結果と名前をメールであなた宛に送信する(JavaScript)
・今の質問の採点結果のみをグラフ...続きを読む

Q電卓の使い方

お恥ずかしながら、電卓の使い方をよく知りません。
今使っている太陽電池式の電卓で、計算をすると、答えに「GT」という文字が表示されます。
どうすればこのGTが表示されなくなるのか教えて下さい。

Aベストアンサー

電卓初段(超マイナー)取得者です^^;

GTは、グランドトータルの事です。
#1さんが回答されてる通り、『=』を押した分が合計されると言う意味です。

これは機種によって違う場合もありますが、
【1+1】をやって、【=】を連打すると押した分だけGTを押した時の合計が変わってきます。

似たような機能でメモリーもあります。
『M+』『M-』とか上の方にありませんか?
それは、GTに似た感じで表示された数値を足したり引いたり出来ます。

以外に電卓の機能ってみなさん使って無いんですよね。。。
慣れれば便利だと思いますよ♪

Qeval()の戻り値

いつもお世話になります。
以下のように配列を定義して、
(1)のforループを抜ける条件をj<=5などのように指示しなくても
できるようにならないかと苦慮しています。

(1)で、
j<=5 が5以下なら動作します。
ところが、6以上となると、配列Menuが定義されていないため
停止してしまいます。
そこで、breakを用いてforループをぬけようとしたのですが何も表示されなくなってしまいます。(5)も実行されません。
(2)(3)(4)と試したのですが、ダメでした。
配列の数をj<=5のように指示しなくても、また、あらかじめ配列の数を変数で定義しなくても、定義した配列だけ表示する方法はないものでしょうか。
よろしくお願いいたします。

Menu1=new Array("aaaaaaaa","");
Menu2=new Array("bbbbbbb","");
Menu3=new Array("cccccccc","");
Menu4=new Array("ddddd","");
Menu5=new Array("eeeeeeeeeee","");
function tstEval(){
document.write('<div id="tstArea">tstArea</div>');
MenuArea=document.getElementById('tstArea');
strHtml="";
for(j=1;j<=5;++j){//(1)
MenuAray=eval('Menu'+j);
// if(MenuAray==empty){//(2)
// if(MenuAray==undefined){//(3)
if(MenuAray==''){//(4)
alert('The End');//(5)
break;
}
strHtml+=j+MenuAray[0]+'<br>';
}
alert(strHtml);
MenuArea.innerHTML = strHtml;
}

いつもお世話になります。
以下のように配列を定義して、
(1)のforループを抜ける条件をj<=5などのように指示しなくても
できるようにならないかと苦慮しています。

(1)で、
j<=5 が5以下なら動作します。
ところが、6以上となると、配列Menuが定義されていないため
停止してしまいます。
そこで、breakを用いてforループをぬけようとしたのですが何も表示されなくなってしまいます。(5)も実行されません。
(2)(3)(4)と試したのですが、ダメでした。
配列の数をj<=5のように指示しなくても、また、あ...続きを読む

Aベストアンサー

No.1です。

前回の回答でMenuArayがMenuArrayになっていようなので、それが原因だと思います。
MenuArrayをMenuArayに直して下さい。

Q関数電卓の使い方

123 EXP (-0.1*3.652) 
という関数電卓の使い方がわかりません!
ちなみに、カシオの電卓です。わかる方は教えてください!!

Aベストアンサー

カシオといってもいろいろな機種があるのですが...
[1][2][3][SHIFT][10x][(][(-)][.][1][*][3][.][6][5][2][=]
最後の[=]は機種によって[EXE]かもしれません。
またカシオなら[10x]は[log]のところにあることが多いです。

Qチェックボックスの取得数値で別のチェックボックスを選択可能に

こんにちは、初めて利用させていただきます。

Javascriptを利用し、下記URLのようなものを作成中です。
http://mag.morirepo.com/test_skill.html
それぞれのテーブルごとに段階を設け、「次の段階に進むためには2ポイント以上消費しなければチェックボックスが表示されない」といったものにしたいのですが、上手くスクリプト書けませんでした。

FirefoxとIEで動作させたいと思っています。
よろしくお願いします。

Aベストアンサー

(1)ご提示のソースの構成という条件で、<table>内の<input>要素は全て
  チェックボックスであると仮定し、そのチェックは省略しています。
(2)同じ段階の項目はinputのname属性が同じであるということを利用して  
  判定しています。 (なので、ご提示の「至近距離技能」のところは
  正しく動作しません。=全部同じnameになっている)
(3)ソースの「onClick="ttlValue()"」と「disabled」の設定は繰り返しが
  多いので、省略できるようにしました。
  下のサンプルのようにすることが可能です。
  (formに代表してonclickを設定しています。)
  (オンロード時に、非表示とdisabledをセットするようにしています)
(4)非表示にしてかつdisabledにするのかどうか不明でしたので(非表示
  だけでもことたりるのか)、一応、disabledにもにしていますが、不要
  ならばはずしてください。
  また、非表示にした時にチェックされている内容をクリアするのか
  どうかも不明でしたので、チェックはそのままです。クリアしたい
  場合は、コメントアウトしてある部分を有効にしてください。
(5)クリックされたらttlValue()が続いて実行されるようになっていますが、
  ttlValue()でやりたいことが良くわからなかったので、とりあえずダミー
  のfunctionになっています。 function ttlValue() を置き換えれば
  そのまま機能するはずです。
  最後の<select>の「onChange="ttlValue()"」は省略できませんので、
  そのまま残しておいてください。

以下、サンプルです。(短くするため、2項目のみに減らしてあります。)
<html>
<head>
<script type="text/javascript">
window.onload = function() {
var i, p = document.getElementById('tableBox').getElementsByTagName('TABLE');
for (i=0; i<p.length; i++) check(p[i]);
}

function test(evt) {
var t = evt.target || evt.srcElement;
if (t.nodeName != 'INPUT' || t.type != 'checkbox') return;
var p = t.parentNode;
while (p.nodeName != 'TABLE') p = p.parentNode;
check(p);
ttlValue();
}

function check(p) {
var n, c, i = 0, e = p.getElementsByTagName('INPUT');
while (e[i]) {
n = e[i].name;
c = 0;
while (e[i] && e[i].name == n) {
if (e[i].checked) c += parseInt(e[i].value);
e[i].disabled = false;
e[i++].style.visibility = 'visible';
}
if (c<2) while (e[i]) {
//e[i].checked = false; //一度消えたらチェックも消す場合
e[i].disabled = true;
e[i++].style.visibility = 'hidden';
}
}
}

function ttlValue() { return; } //←省略しています
</script>
</head>

<body>

<form name="skillForm" onclick="test(event)">
<div id="tableBox">
<p>( )内の数値は必要ポイントです。</p>

<h3>防御技能</h3>
<table cellspacing="0">
<tr>
<td colspan="2" class="top left dankai">第1段階</td>
<td colspan="2" class="top dankai">第2段階</td>
<td colspan="2" class="top dankai">第3段階</td>
<td class="top dankai">第4段階</td>
</tr>
<tr>
<td class="left noLineUnder green">HGリロードタイム</td>
<td class="noLineUnder green">切替速度</td>
<td class="noLineUnder yellow2">PDW</td>
<td class="noLineUnder green">連射タイム</td>
<td class="noLineUnder yellow1">サイレンサー</td>
<td class="noLineUnder green">振る速度向上</td>
<td class="noLineUnder green">リーチ拡張</td>
</tr>
<tr>
<td class="left chBox green"><i>(1)</i>
<input name="bx2Lv1" type="checkbox" value="1" /></td>
<td class="chBox green"><i>(1)</i>
<input name="bx2Lv1" type="checkbox" value="1" /></td>
<td class="chBox yellow2"><i>(3)</i>
<input name="bx2Lv2" type="checkbox" value="3" /></td>
<td class="chBox green"><i>(2)</i>
<input name="bx2Lv2" type="checkbox" value="2" /></td>
<td class="chBox yellow1"><i>(2)</i>
<input name="bx2Lv3" type="checkbox" value="2" /></td>
<td class="chBox green"><i>(2)</i>
<input name="bx2Lv3" type="checkbox" value="2" /></td>
<td class="chBox green"><i>(2)</i>
<input name="bx2Lv4" type="checkbox" value="2" /></td>
</tr>
</table>

<h3>身体技能</h3>
<table cellspacing="0">
<tr>
<td colspan="3" class="top left dankai">第1段階</td>
<td colspan="3" class="top dankai">第2段階</td>
<td colspan="2" class="top dankai">第3段階</td>
<td class="top dankai">第4段階</td>
</tr>
<tr>
<td class="left noLineUnder green">衝突抵抗度</td>
<td class="noLineUnder green">探知力向上</td>
<td class="noLineUnder green">ダッシュ回復力増加</td>
<td class="noLineUnder green">上級空挺部隊</td>
<td class="noLineUnder green">隠密性向上</td>
<td class="noLineUnder green">持久力増加</td>
<td class="noLineUnder green">科学攻撃抵抗度</td>
<td class="noLineUnder green">爆発への抵抗</td>
<td class="noLineUnder green">体力増加</td>
</tr>
<tr>
<td class="left chBox green"><i>(1)</i>
<input name="bx3Lv1" type="checkbox" value="1" /></td>
<td class="chBox green"><i>(1)</i>
<input name="bx3Lv1" type="checkbox" value="1" /></td>
<td class="chBox green"><i>(1)</i>
<input name="bx3Lv1" type="checkbox" value="1" /></td>
<td class="chBox green"><i>(2)</i>
<input name="bx3Lv2" type="checkbox" value="2" /></td>
<td class="chBox green"><i>(2)</i>
<input name="bx3Lv2" type="checkbox" value="2" /></td>
<td class="chBox green"><i>(2)</i>
<input name="bx3Lv2" type="checkbox" value="2" /></td>
<td class="chBox green"><i>(4)</i>
<input name="bx3Lv3" type="checkbox" value="4" /></td>
<td class="chBox green"><i>(4)</i>
<input name="bx3Lv3" type="checkbox" value="4" /></td>
<td class="chBox green"><i>(5)</i>
<input name="bx3Lv4" type="checkbox" value="5" /></td>
</tr>
</table>
</div>
<div id="LvPt">
Lv.<select name="ch2" onChange="ttlValue()">
<option value="1" selected>1</option>
<option value="2">2</option>
<!-- 以下省略 -->
</select>
残り<INPUT name="result" type="text" value="1" size="3" id="result" /> pt
</div>
</form>
</body>
</html>

(1)ご提示のソースの構成という条件で、<table>内の<input>要素は全て
  チェックボックスであると仮定し、そのチェックは省略しています。
(2)同じ段階の項目はinputのname属性が同じであるということを利用して  
  判定しています。 (なので、ご提示の「至近距離技能」のところは
  正しく動作しません。=全部同じnameになっている)
(3)ソースの「onClick="ttlValue()"」と「disabled」の設定は繰り返しが
  多いので、省略できるようにしました。
  下のサンプルのようにするこ...続きを読む


人気Q&Aランキング