2016-03-21 15 views
0

"1+2+3" gibi bir dize ifadem var ve bir dize olarak kalmalıdır. Diğer bir deyişle, işlemi gerçekleştirmek için rakamları döngülemek ve yayınlamak bir seçenek değildir, bu yüzden benim çözümüm eval("1+2+3"). Ancak eval() yavaş ve onunla ilgili tüm bu sorunlara sahip. Dizgemi değerlendirmek için bir alternatif var mı?Bu ifade için bir eval() alternatifi var mı?

+0

bu ifade girdi olarak, "1", "2" ve "3", örneğin alarak inşa edilebilir mi? –

+3

Cesaretiniz varsa kendi çözümleyicinizi yazabilir veya [NPM] (http://npmjs.com) üzerinde sizin için bir şeyler bulabilirsiniz. 'eval' yavaş değil. Bu sadece ** sorun **. – tadman

+1

Dizenin bölümlerini sayılara dönüştürebilir ve çeviremezseniz, başka bir seçenek yoktur, ancak buradaki değerlendirmeler de budur, – adeneo

cevap

2

Bir dizgiyi değerlendirmek yalnızca yavaş değil, tehlikeli. Ya da, kötü niyetli bir kullanıcı niyet veya hatası ile, programınızı çökerten, kodunuzu değerlendiren ve verilerinizi yok eden bir güvenlik açığı açarsanız ne olur?

Hayır, dizeyi eval() yapmamalısınız. Bölünmeli, işlenenleri sayılara ayırmalı ve özetlemelisiniz.

Sen (siz dize ihtiyacı olduğunu söyledi) isterseniz etrafında string tutmak, ama aslında bu işlem bir Gerçekten Kötü Fikir olduğunu gerçekleştirmek için string kullanarak yapabilirsiniz.

var string = "1+2+3" 
var numbers = string.split('+').map(function(x) { return parseInt(x) }) 
var sum = numbers.reduce(function(total, x) { return total + x }, 0) 
+1

OP: "İşlemi gerçekleştirmek için rakamların kaydedilmesi bir seçenek değildir_" – dandavis

+0

Bu, 'değerlendirmenin' yaptığı şeydir. Bunu yapmak için bir işlevi çağırırsanız, fark nedir? – slezica

0

Bu saçma bir soru:

var reducer = function (a, b) { 
    return +a + +b; 
}; 

"1+2+3".match(/[+-]?\d+/g).reduce(reducer); // 6 

// or addition only 
"1+2+3".split(/\D/).reduce(reducer); // 6 
İlgili konular