2011-09-09 4 views
3

:문자열에서 연산자를 호출하고 실행하는 방법은 무엇입니까? 예를 들어

var s = '3+3'; 
s.replace(/([\d.]+)([\+\-)([^,]*)/g, 
     function(all, n1, operator, n2) { 
       r = new Number(n1) ??? new Number(n2); 
       return r; 
     } 
); 

참고 : 상자 밖으로 가능하지 eval()

+0

는 몇 가지 경우 중 하나'평가 같은데()'편리 할 것 . – alex

+0

'new Function()도 제한에서 벗어 났습니까? – alex

+0

호기심에서'eval()'을 사용하지 않는 이유는 무엇입니까? –

답변

5

Are Variable Operators Possible?

를 사용하지만, 그는 다음과 같이, 그것을 할 수있는 좋은 구현을 준다. 코드 by delnan.

var operators = { 
    '+': function(a, b) { return a + b }, 
    '<': function(a, b) { return a < b }, 
    // ... 
}; 

var op = '+'; 
alert(operators[op](10, 20)); 

그래서 당신의 구현을 위해

r = operators[operator](new Number(n1), new Number(n2)); 
+1

+1은 if/else 또는 switch/case 대신에 객체를 사용하여 연산자 함수를 조회합니다. – jfriend00

1

귀하의 정규식은 약간 끊어집니다.

/([\d.]+)([\+\-)([^,]*)/g 

아마

/([\d.]+)([+-])([\d+]+)/g 

은 다음 운영자에 전환 할 수 있어야한다 :

function (_, a, op, b) { 
    switch (op) { 
    case '+': return a - -b; 
    case '-': return a - b; 
    } 
} 
0
s.replace(/(\d+)\s*([+-])\s*(\d+)/g, function(all, s1, op, s2) { 
    var n1 = Number(s1), n2 = Number(s2); 
    return (op=='+') ? (n1+n2) : (n1-n2); 
});