Оценка строки как математическое выражение в JavaScript

Как я анализирую и оцениваю математическое выражение в строке (например. '1+1') без вызова eval(string) привести к его численному значению?

С тем примером я хочу, чтобы функция приняла '1+1' и возвратитесь 2.

62
задан nbrooks 4 February 2013 в 10:51
поделиться

4 ответа

В конце концов я выбрал это решение, которое работает для суммирования положительных и отрицательных целых чисел (и с небольшой модификацией регулярного выражения будет работать и для десятичных чисел) :

function sum(string) {
  return (string.match(/^(-?\d+)(\+-?\d+)*$/)) ? string.split('+').stringSum() : NaN;
}   

Array.prototype.stringSum = function() {
    var sum = 0;
    for(var k=0, kl=this.length;k<kl;k++)
    {
        sum += +this[k];
    }
    return sum;
}

Я не уверен, что это быстрее, чем eval (), но, поскольку мне приходится выполнять операцию много раз, мне гораздо удобнее запускать этот сценарий, чем создавать множество экземпляров компилятора javascript

2
ответ дан 24 November 2019 в 16:42
поделиться

Vim Omnicomplete является особенностью Vim версии 7, на всех платформах. Vim Intellisense является плагином для vim 6.1 и 6.2 только в Windows.

-121--1459324-

При разработке XCode элемент пользовательского интерфейса или «вид» находится перед другим видом, если он является подчиненным видом этого вида. Например, если вид B является фоном, а вид C является элементом управления, то для размещения элемента управления над фоном (т.е. ближе к пользователю) вид C должен быть подобъектом вида B. В построителе интерфейсов это выполняется путем перетаскивания элемента управления в фон.

По существу, вы смотрите на древовидную структуру, при этом виды в фоновом режиме находятся рядом с корнем дерева, а виды на переднем плане (ближе к пользователю) - рядом с листьями дерева.

Документ Windows and Views из документации Apple для разработчиков iPhone может помочь прояснить ситуацию.

Примечание 1: Практически не следует перекрывать отдельные элементы управления, такие как кнопки и текстовые поля. Это идет вразрез с инструкциями Apple по пользовательскому интерфейсу. Вы можете , конечно, все еще делать это, если вы хотите, но вы должны знать, что вы выходите из зоны безопасности. Если вы просто пишете «нормальное» приложение для iPhone, ваша лучшая ставка заключается в том, чтобы придерживаться способа Apple делать вещи.

Примечание 2: Если по каким-либо причинам необходимо перекрывать объекты в определенном пути, можно использовать объекты CALayer для обеспечения правильного упорядочения всех объектов. Объекты CALayer являются частью технологии Apple Core Animation.

-121--942925-

//Вы можете сделать + или - легко:

function addbits(s){
    var total= 0, s= s.match(/[+\-]*(\.\d+|\d+(\.\d+)?)/g) || [];
    while(s.length){
        total+= parseFloat(s.shift());
    }
    return total;
}

var string='1+23+4+5-30';
addbits(string)

Более сложная математика делает eval более привлекательным - и, конечно, проще писать.

21
ответ дан 24 November 2019 в 16:42
поделиться

Кто-то должен разобрать эту строку. Если это не интерпретатор (через eval), то это должны быть вы, пишущие процедуру разбора для извлечения чисел, операторов и всего остального, что вы хотите поддерживать в математическом выражении.

Так что, нет, нет никакого (простого) способа без eval. Если вы беспокоитесь о безопасности (потому что входные данные, которые вы разбираете, не из источника, который вы контролируете), возможно, вы можете проверить формат входных данных (с помощью регекс-фильтра белого списка), прежде чем передавать их в eval?

17
ответ дан 24 November 2019 в 16:42
поделиться

Недавно я сделал это на C# (без Eval() для нас...), оценив выражение в обратной польской нотации (это самая простая часть). Самое сложное - разобрать строку и преобразовать ее в обратную польскую нотацию. Я использовал алгоритм Shunting Yard, поскольку в Википедии есть отличный пример и псевдокод. Я обнаружил, что реализовать оба алгоритма очень просто, и рекомендую, если вы еще не нашли решение или рассматриваете альтернативы.

6
ответ дан 24 November 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: