あるコードで、フォームで受け取った数値を(数値にする目的でだと思うのですが)、evalしている箇所があるのですが、
javascript
1eval(フォームで受け取った数値);
質問1
・フォームで受け取った数値は必ず文字列になるのでしょうか?
質問2
・仮にフォームで受け取った数値でなかった場合、数値にする目的で文字列をevalしても良いでしょうか?
javascript
1typeof '100'; //"string" 2typeof eval('100'); //"number"
質問3
・下記はどういう意味でしょうか?
算術式を評価する目的で eval() を呼び出してはいけません。JavaScript は算術式を自動的に評価します
Do not call eval() to evaluate an arithmetic expression; JavaScript evaluates arithmetic expressions automatically.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
フォームで受け取った数値をeval()、質問3に関して
そんなコード使わないほうが良いでしょう。
eval()というのは引数に渡した値をJavaScriptコードとして動的に実行します。
つまるところ、コードを書けば、それが実行できるということです。
もし、悪意のあるコードを記述すれば、(eval()した後にその値をどのように処理するかにもよりますが、処理によっては)重大なXSS脆弱性を生むことにもなります。
参考リンク MDN eval()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval
input要素などに入力された値に対してJavaScriptで処理を行いたい場合はvalueを取得して…という方法で可能ですので、わざわざeval()する必要性は皆無です。
質問2に関して
JavaScriptのデータ型の書式について少し誤解があるのかもしれません。
'1' //クォーテーションで囲むと文字列です 1 //数値は何も囲いません
受け取った値に対して型変換したい場合は、それぞれ専用のメソッドがあります。eval()ではなくそれらを利用しましょう。
また、受け取った値が必ず文字列か?と言われると、同じように取得にどのような処理をしているかによって変わってきます。(ただ、型変換等は基本としてやるかな…?と思います。)
この辺りも一緒に確認されてみてはいかがでしょう?
- データ型 (JavaScript)
https://msdn.microsoft.com/ja-jp/library/7wkd9z69(v=vs.94).aspx
- 型変換のいろいろ
投稿2016/04/03 05:48
総合スコア700
0
解決済みのようですが、やや誤解があるようなので補足します。
「フォームで受け取った値」を「input
要素ノードのプロパティを参照した場合」だとして、String
型に限定されてはいません。
input.value
…String
型input.valueAsNumber
…Number
型input.valueAsDate
…Object
型 (new Date
)
HTML
1<input type="number" value="1"> 2<input type="date" value="2016-04-06"> 3<input type="text" value="2"> 4 5<script type="text/javascript"> 6'use strict'; 7console.log(typeof document.querySelector('input[type=number]').valueAsNumber); // "number" 8console.log(typeof document.querySelector('input[type=date]').valueAsDate); // "object" 9console.log(Object.prototype.toString.call(document.querySelector('input[type=date]').valueAsDate)); // "[object Date]" 10console.log(typeof document.querySelector('input[type=text]').valueAsNumber); // "number" 11</script>
Re: re97 さん
投稿2016/04/05 18:36
編集2016/04/05 18:37総合スコア18162
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/06 23:44 編集
2016/04/07 01:58
0
ベストアンサー
* 質問1 ・フォームで受け取った数値は必ず文字列になるのでしょうか?
はい。文字列です。 フォームのテキストボックスに 1 をいれた場合は "1" の文字列になります。
* 質問2 ・仮にフォームで受け取った数値でなかった場合、数値にする目的で文字列をevalしても良いでしょうか?
eval() の利用は避けるべきです。
文字列 -> 整数に変換するメソッドが javascript には存在しています。
- JavaScriptで文字列を数値に変換する:Number(), parseInt(), parseFloat() http://uxmilk.jp/11582
* 質問3 ・下記はどういう意味でしょうか?
算術式 (1 + 2) を計算する為に eval() を使う必要はありません。javascropt は算術式を計算する機能を持っているので。
var a = eval(1 + 2);
でなく
var a = 1 + 2;
とできるということです。
(eval は evaluate という単語(評価するという意味がある) の省略なので eval(1+2) という記述は不自然ではないが、こう書く必要はないということ)
投稿2016/04/03 09:10
総合スコア22324
0
質問2に関して,JavaScript では昔から以下のような暗黙の型変換を利用したテクニックがあります。
var num_str = "100";
typeof num_str; // "string"
var num = num_str * 1;
typeof num; // "number"
var num2 = num_str - 0;
typeof num2; // "number"
数値を表す文字列に対して「*1」や「-0」のように算術を行うと,JavaScript では暗黙的に文字列を数値として扱う仕様となっています。「*1」や「-0」を使用すれば,数値の値自体は変化しないので,実質数値を表す文字列をそのまま数値として使用できます。ただし「+0」は使用できません。「+」は文字列の連結にも使用されるため,数値を表す文字列の方に影響されて「+0」とすると暗黙的に「0」の方が文字に変換されてしますからです。
また,他にも注意点があります。
- 数値を表す文字列の中に数値以外の文字が含まれていないことを確認してから使用すること。数値以外の文字が含まれているとエラーとなります。
- 算術式の評価順序によっては,正しく動作しないことがあるので,暗黙の型変換の仕様を正しく把握してから使用すること。
初心者が安易に使うべきものではないかもしれませんが,たまに見かけるので知っておいて損はないと思います。
あと,フォームで受け取った値を直接 eval() することは厳禁です。絶対やってはいけません。必ずといっていいほど脆弱性となります。
投稿2016/04/09 02:51
総合スコア28
0
- 文字列になると思います。
parseInt
を使いましょう。
JavaScript
1parseInt( '100', 10 ); // 100
3は、多分こういうことかなと。
JavaScript
1var a = eval("2 + 2"); // 4 2var b = 2 + 2; // 4
JavaScript の中でも特殊な立ち位置にある eval
は避けれるなら避けて、それ以外解決方法がない場合に使用する、くらいにしておいたほうが良いと思います。
投稿2016/04/03 05:58
総合スコア69407
0
1.
フォームに入力される文字列が必ず数値とは限らないので、JavaScriptにかぎらず、ほとんどの言語
では普通は文字列として受け取ります。(例外もあるかもしれませんが。)
2.
(プログラムが動くという意味では)問題はないと思います。
ただし、JSは気をつけて実装しないと多くの脆弱性を生む可能性があるので、詳しくは、他の方の解答を参考にしてください。
3.
日本語がわかりづらいですね。英語の表現がわかりやすいです。算術式を引数にする使い方は推奨しないということでしょう。文字列を入れるべきということです。
Do not call eval() to evaluate an arithmetic expression
具体的にいうと、下記のような意味かと。
JavaScript
1○ eval("2 + 2"); // 文字列だからOK 2○ eval("2"); // 文字列だからOK 3× eval(2 + 2); // 算術式だからNG 4× eval(2) // 2という数値(算術式)だからNG
投稿2016/04/03 05:46
編集2016/04/03 05:59総合スコア907
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/04 02:36
2016/04/05 17:15 編集
2016/04/06 02:48