Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Превратить строку в оператор (https://javascript.ru/forum/misc/72293-prevratit-stroku-v-operator.html)

ZNGR 20.01.2018 02:27

Превратить строку в оператор
 
Всем, доброго времени суток.

Учу JS и одна из задач состоит в том, чтобы написать функцию с аргументами X, znak (в виде строки), Y. Не могу понять как сделать таким образом, чтобы происходила математическая операция. Все до чего додумался это использовать switch (ну или if ). Может кто-то подскажет более изящное решение? Заранее благодарен.

function doMath(x,znak,y){
	var math = 0;
	switch(znak) {
		case '+':
		math = x + y;
		break;

		case '-':
		math = x - y;
		break;

		case '*':
		math = x * y;
		break;

		case '/':
		math = x / y;
		break;

		case '%':
		math = x % y;
		break;

		case '^':
		math = x ^ y;
		break;
	}
	return math
}

Aetae 20.01.2018 02:47

Единственный безопасный вариант. Именно так и стоит делать.
А так в плане поиграться есть eval:
alert( eval(1 + ' + ' + 3) )

ZNGR 29.01.2018 18:35

Цитата:

Сообщение от Aetae (Сообщение 475781)
Единственный безопасный вариант. Именно так и стоит делать.
А так в плане поиграться есть eval:
alert( eval(1 + ' + ' + 3) )

Спасибо, очень признателен

Dilettante_Pro 29.01.2018 19:06

ZNGR,
Чтобы без eval и вводить сложные формулы - Обратная польская запись, пост №14

j0hnik 29.01.2018 22:01

Dilettante_Pro,
нажимаете (permalink) в нужном посте и вуаля

http://javascript.ru/forum/showthrea...876#post405876

Vlasenko Fedor 29.01.2018 23:08

знаю 3 способа выполнить строку
1. eval
2. Function
3. Вставить <script> динамически
Кто знает еще варианты?

Белый шум 30.01.2018 01:22

Безопасный eval:
http://blog.namangoel.com/replacing-...h-a-web-worker

Vlasenko Fedor 30.01.2018 02:51

Эт забыл про worker :)
function getWorker() {
        var blob;
        window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
        var mimeString = 'application/javascript';
        var code = "onmessage = function(e) { postMessage('My' + e.data); }";
        try {
            blob = new Blob([code], {type: mimeString});
        } catch (e) {
            var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
                window.MozBlobBuilder || window.MSBlobBuilder;
            var bb = new BlobBuilder();
            bb.append(code);
            blob = bb.getBlob(mimeString);
        }
        var url = window.URL.createObjectURL(blob);
        var worker = new Worker(url);
        URL.revokeObjectURL(url);
        return worker;
    }

    var worker = getWorker();
    worker.postMessage('Test');
    worker.onmessage = function (e) {
        alert(e.data);
    };

Пример Function
var fn = "function (a, b) {\
return a + b;\
}";
var call = Function('return ' + fn)();

alert(call(1, 2));

Alexandroppolus 30.01.2018 22:17

Цитата:

Сообщение от Poznakomlus (Сообщение 476600)
Пример Function
var fn = "function (a, b) {\
return a + b;\
}";
var call = Function('return ' + fn)();

alert(call(1, 2));

проще так:
var call = Function('a,b', 'return a + b');

alert(call(1, 2));

j0hnik 30.01.2018 22:26

Цитата:

Сообщение от Poznakomlus (Сообщение 476585)
Кто знает еще варианты?

отправить на сервер, выполнить и вернуть ответ


Часовой пояс GMT +3, время: 15:55.