Альтернатива отличному ответу @kennebec, используя более короткое регулярное выражение и позволяющее пробелы между операторами
function addbits(s) {
var total = 0;
s = s.replace(/\s/g, '').match(/[+\-]?([0-9\.\s]+)/g) || [];
while(s.length) total += parseFloat(s.shift());
return total;
}
Использовать его как
addbits('5 + 30 - 25.1 + 11');
Обновить
Вот более оптимизированная версия
function addbits(s) {
return (s.replace(/\s/g, '').match(/[+\-]?([0-9\.]+)/g) || [])
.reduce(function(sum, value) {
return parseFloat(sum) + parseFloat(value);
});
}