Đánh giá biểu thức toán học trong javascript

Thư viện này là phiên bản sửa đổi của Trình phân tích cú pháp biểu thức ActionScript của Raphael Graf (trước đây tại http. //www. chưa xác định. ch/mparser/chỉ mục. html). Khi tôi viết JavaScript Function Plotter, tôi muốn có một giải pháp thay thế tốt hơn cho việc sử dụng hàm eval của JavaScript. Hiện tại không có rủi ro bảo mật nào vì bạn chỉ có thể chạy mã trong trình duyệt của riêng mình, nhưng nó không thuận tiện cho toán học (Math.pow(2, x) thay vì 2^x, v.v. )

Tải xuống

Lấy mã từ github

Tài liệu (không đầy đủ, tất nhiên)

Trình phân tích cú pháp

js> expr = Parser.parse("2 ^ x");
(2^x)
js> expr.evaluate({ x: 3 });
8
0 là lớp học chính trong thư viện. Nó có các phương thức "tĩnh" để phân tích cú pháp và đánh giá các biểu thức

Trình phân tích cú pháp () Trình xây dựng. Trong hầu hết các trường hợp, bạn không cần điều này. Cuối cùng, tôi sẽ bắt đầu ghi lại lý do tại sao bạn muốn, nhưng hiện tại, bạn có thể tìm ra nó bằng cách đọc nguồn ;-).
parse({expression: string})
Convert a mathematical expression into an Expression object.
evaluate({expression: string} [, {variables: object}])
Parse and immediately evaluate an expression using the values/functions from the {variables} object.
Parser.evaluate(expr, vars) is equivalent to calling Parser.parse(expr).evaluate(vars). In fact, that’s exactly what it does.

Trình phân tích cú pháp. Biểu hiện

js> expr = Parser.parse("2 ^ x");
(2^x)
js> expr.evaluate({ x: 3 });
8
1 trả về một đối tượng
js> expr = Parser.parse("2 ^ x");
(2^x)
js> expr.evaluate({ x: 3 });
8
0.
js> expr = Parser.parse("2 ^ x");
(2^x)
js> expr.evaluate({ x: 3 });
8
0 tương tự như các hàm JavaScript, tôi. e. chúng có thể được "gọi" với các biến được liên kết với các giá trị được truyền vào. Trên thực tế, chúng thậm chí có thể được chuyển đổi thành các hàm JavaScript

đánh giá ([{biến. đối tượng}])Đánh giá một biểu thức, với các biến được liên kết với các giá trị trong {biến}. Mỗi biến không liên kết trong biểu thức được liên kết với thành viên tương ứng của đối tượng {variables}. Nếu có các biến không liên kết, đánh giá sẽ đưa ra một ngoại lệ.
js> expr = Parser.parse("2 ^ x");
(2^x)
js> expr.evaluate({ x: 3 });
8
substitute({variable: string}, {expr: Expression, string, or number})
Create a new expression with the specified variable replaced with another expression (essentially, function composition).
js> expr = Parser.parse("2 * x + 1");

((2x)+1)
js> expr. replace("x", "4 * x");
((2(4*x))+1)
js> expr2. đánh giá ({ x. 3});
25

simplify({variables: object>)
Simplify constant sub-expressions and replace variable references with literal values. This is basically a partial evaluation, that does as much of the calcuation as it can with the provided variables. Function calls are not evaluated (except the built-in operator functions), since they may not be deterministic.
Simplify is pretty simple (see what I did there?). It doesn’t know that addition and multiplication are associative, so “((2*(4*x))+1)” from the previous example cannot be simplified unless you provide a value for x. “2*4*x + 1″ can however, because it’s parsed as “(((2*4)*x)+1)”, so the “(2*4)” sub-expression will be replaced with “8″, resulting in “((8*x)+1)”.
js> expr = Parser.parse("x * (y * atan(1))").simplify({ y: 4 });

(x*3. 141592653589793)
js> expr. đánh giá ({ x. 2 });
6. 283185307179586

variables()
Get an array of the unbound variables in the expression.
js> expr = Parser.parse("x * (y * atan(1))");

(x*(y*atan(1)))
js> expr. biến();
x,y
js> expr. đơn giản hóa ({ y. 4 }). biến();
x

toString()
Convert the expression to a string. toString() surrounds every sub-expression with parentheses (except literal values, variables, and function calls), so it’s useful for debugging precidence errors.
toJSFunction({parameters: Array} [, {variables: object}])
Convert an Expression object into a callable JavaScript function. You need to provide an array of parameter names that should normally be expr.variables(). Any unbound-variables will get their values from the global scope.
toJSFunction works by simplifying the Expression (with {variables}, if provided), converting it to a string, and passing the string to the Function constructor (with some of its own code to bring built-in functions and constants into scope and return the result of the expression).

Cú pháp biểu thức

Trình phân tích cú pháp chấp nhận một ngữ pháp khá cơ bản. Các toán tử có mức độ ưu tiên thông thường — f(x,y,z) (gọi hàm), ^ (lũy thừa), *, /, và % (nhân, chia và dư), và cuối cùng là +, -, và. (cộng, trừ và nối chuỗi) — và liên kết từ trái sang phải (vâng, thậm chí là lũy thừa… cách đó đơn giản hơn)

Ngoài ra còn có toán tử “,” (dấu phẩy) nối các giá trị thành một mảng. Nó chủ yếu hữu ích khi truyền đối số cho hàm, vì không phải lúc nào nó cũng hoạt động như bạn nghĩ đối với mảng nhiều chiều. Nếu giá trị bên trái là một mảng, nó sẽ đẩy giá trị bên phải vào cuối mảng, nếu không, nó sẽ tạo một mảng mới “[trái, phải]“. Điều này làm cho không thể tạo một mảng với một mảng khác vì nó là phần tử đầu tiên

Toán tử hàm

Trình phân tích cú pháp có một số "hàm" tích hợp thực sự là các toán tử. Sự khác biệt duy nhất từ ​​quan điểm bên ngoài là chúng không thể được gọi với nhiều đối số và chúng được đánh giá bằng phương thức đơn giản hóa nếu đối số của chúng là hằng số

HàmMô tảsin(x)Sine của x (x tính bằng radian)cos(x)Cosine của x (x tính bằng radian)tan(x)Tiếp tuyến của x (x là… bạn biết đấy)asin(x)Cung sin của x . Kết quả là NaN (Không phải là Số) nếu x âm. log(x)Logarit tự nhiên của x (không phải cơ số 10). Đó là nhật ký thay vì ln vì đó là cách JavaScript gọi nó. abs(x)Giá trị tuyệt đối (độ lớn) của trần x(x)Trần của x — số nguyên nhỏ nhất >= x. floor(x)Tầng của x — số nguyên lớn nhất <= xround(x)X, được làm tròn thành số nguyên gần nhất, sử dụng "làm tròn cấp trường". exp(x)ex (hàm số mũ/phản logarit với cơ số e)

chức năng được xác định trước

Bên cạnh các hàm “toán tử”, có một số hàm được xác định trước. Bạn có thể cung cấp các biến của riêng mình bằng cách liên kết các biến với các hàm JavaScript thông thường. Chúng không được đánh giá bằng cách đơn giản hóa

JavaScript có thể được sử dụng cho toán học không?

JavaScript có một máy tính tích hợp và các phép toán có thể được thực hiện trực tiếp trong bảng điều khiển . Chúng ta có thể thực hiện một số phép cộng đơn giản với các số, ví dụ như cộng 10 và 20, sử dụng dấu cộng ( +).

Tôi có thể sử dụng cái gì thay cho eval trong JavaScript?

Một thay thế cho eval là Function() . Cũng giống như eval() , Function() nhận một biểu thức nào đó dưới dạng một chuỗi để thực thi, ngoại trừ, thay vì xuất kết quả trực tiếp, nó trả về một hàm ẩn danh cho bạn mà bạn có thể gọi. `Function() là một giải pháp thay thế nhanh hơn và an toàn hơn cho eval().

Biểu thức JavaScript là gì?

Biểu thức của JavaScript là một tập hợp hợp lệ gồm các chữ, biến, toán tử và biểu thức đánh giá một giá trị duy nhất là một biểu thức . Giá trị duy nhất này có thể là một số, một chuỗi hoặc một giá trị logic tùy thuộc vào biểu thức. Thí dụ. Javascript.