Как я анализирую и оцениваю математическое выражение в строке (например. '1+1'
) без вызова eval(string)
привести к его численному значению?
С тем примером я хочу, чтобы функция приняла '1+1'
и возвратитесь 2
.
В конце концов я выбрал это решение, которое работает для суммирования положительных и отрицательных целых чисел (и с небольшой модификацией регулярного выражения будет работать и для десятичных чисел) :
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
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 более привлекательным - и, конечно, проще писать.
Кто-то должен разобрать эту строку. Если это не интерпретатор (через eval
), то это должны быть вы, пишущие процедуру разбора для извлечения чисел, операторов и всего остального, что вы хотите поддерживать в математическом выражении.
Так что, нет, нет никакого (простого) способа без eval
. Если вы беспокоитесь о безопасности (потому что входные данные, которые вы разбираете, не из источника, который вы контролируете), возможно, вы можете проверить формат входных данных (с помощью регекс-фильтра белого списка), прежде чем передавать их в eval
?
Недавно я сделал это на C# (без Eval() для нас...), оценив выражение в обратной польской нотации (это самая простая часть). Самое сложное - разобрать строку и преобразовать ее в обратную польскую нотацию. Я использовал алгоритм Shunting Yard, поскольку в Википедии есть отличный пример и псевдокод. Я обнаружил, что реализовать оба алгоритма очень просто, и рекомендую, если вы еще не нашли решение или рассматриваете альтернативы.