:문자열에서 연산자를 호출하고 실행하는 방법은 무엇입니까? 예를 들어
var s = '3+3';
s.replace(/([\d.]+)([\+\-)([^,]*)/g,
function(all, n1, operator, n2) {
r = new Number(n1) ??? new Number(n2);
return r;
}
);
참고 : 상자 밖으로 가능하지 eval()
:문자열에서 연산자를 호출하고 실행하는 방법은 무엇입니까? 예를 들어
var s = '3+3';
s.replace(/([\d.]+)([\+\-)([^,]*)/g,
function(all, n1, operator, n2) {
r = new Number(n1) ??? new Number(n2);
return r;
}
);
참고 : 상자 밖으로 가능하지 eval()
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은 if/else 또는 switch/case 대신에 객체를 사용하여 연산자 함수를 조회합니다. – jfriend00
귀하의 정규식은 약간 끊어집니다.
/([\d.]+)([\+\-)([^,]*)/g
아마
/([\d.]+)([+-])([\d+]+)/g
은 다음 운영자에 전환 할 수 있어야한다 :
function (_, a, op, b) {
switch (op) {
case '+': return a - -b;
case '-': return a - b;
}
}
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);
});
는 몇 가지 경우 중 하나'평가 같은데()'편리 할 것 . – alex
'new Function()도 제한에서 벗어 났습니까? – alex
호기심에서'eval()'을 사용하지 않는 이유는 무엇입니까? –