今や表計算ソフトはなくてはならないものになった。 特に Excel が強いのは承知で、 表計算ソフトの世話にはならずとも自分でできることはしたい。 そのための道具として、JavaScript を考えている。
ここでは、式を入れれば計算をするという機能を作ろう。 これには JavaScript の eval という関数があり、以前は重宝していたが、 現在はセキュリティ上の問題等により、eval ではなく他の関数を使うように勧告されている。 eval() (developer.mozilla.org) の項を参照してほしい。
ここでは、上記参照ページにあるように、Function() を使ったコードに変更している。 Function() については下記参照。
たとえば、式の欄に x * x * 3.14 と入れる。 これは半径 x の円の面積を求める式になる。 x の欄に 3 を入れて、「計算」ボタンをクリックすると、 答の欄は 28.26 となる。 この答はとりもなおさず、半径 3 の円の面積である。 これは、Excel でいう、ゴールシーク機能を実現する時の基礎技術となる。 上記で、3.14 の代わりに Math.PI と入れると、より精度の高い値が得られる。
書き直し前は次の構文だった :
var x = eval(input); // input は入力式の文字列。例:'3 * 3' var output = eval(formula); // formula は式。例: 'x * x * 3.14'
書き直し後は次の通りである。
let s = `use "strict";const x=${input};return (${formula})`; let output = Function(s)();
書き直した点は他にもいくつかある。
以前は JavaScript の with 構文を利用していたため、円周率に PI を、 三角関数に sin() などと書くことができた。現在、with は曖昧性をもちこむため、使用は推奨されない。 with(developper.mozilla.org) 参照。そのため、明示的に Math.PI, Math.sin() など、 Math オブジェクトを明示してほしい。
var 宣言は予期せぬ結果をもたらすことがあるので、let に変更した。 var と let, const の使い方参照。
なお、上記式のテキストでは下記の Math オブジェクトのプロパティとメソッドが使える。 ECMAScript (ECMA-262 Edition 5.1) による。
プロパティ | 説明 | 値 |
---|---|---|
Math.E | 自然対数の底 e | 2.7182818284590452354 |
Math.LN10 | x = 10 における 自然対数 `ln(x)` の値 | 2.302585092994046 |
Math.LN2 | x = 2 における自然対数 `ln(x)` の値 | 0.6931471805599453 |
Math.LOG2E | x = e における底が 2 の対数 `log_2 x` の値 | 1.4426950408889634 |
Math.LOG10E | x = e における底が 10 の対数 `log_10 x` の値 | 0.4342944819032518 |
Math.PI | 円周率 π | 3.1415926535897932 |
Math.SQRT1_2 | sqrt(1/2) | 0.7071067811865476 |
Math.SQRT2 | sqrt(2) | 1.4142135623730951 |
メソッド | 説明 | 備考 |
---|---|---|
Math.abs(x) | 絶対値 | |
Math.acos(x) | arccos | 定義域は [0, pi] |
Math.asin(x) | arcsin | 定義域は [-pi/2, pi/2] |
Math.atan(x) | arctan | 定義域は [-pi/2, pi/2] |
Math.atan2(y,x) | ||
Math.ceil(x) | ||
Math.cos(x) | ||
Math.exp(x) | ||
Math.floor(x) | ||
Math.log(x) | ||
Math.max([value1[, value2[, ...]]]) | ||
Math.min([value1[, value2[, ...]]]) | ||
Math.pow(x,y) | ||
Math.random() | ||
Math.round() | ||
Math.sin(x) | ||
Math.sqrt(x) | ||
Math.tan(x) |
この機能を応用した一例として、数値積分のページがある。
まりんきょ学問所 > JavaScript 手習い > eval から Funciton へ