是否可以使用特定字符串执行JavaScript函数?
我正在通过编写后缀表示法计算器来学习JavaScript。
示例:如果我写入输入框" 5!",我希望factorial(5)
被执行,或者如果我写3nCr5
,请执行ncr(3,5)
等
答案 0 :(得分:1)
由于您的目标是学习Javascript,因此使用JavaScript执行字符串解析的方式是使用正则表达式,顺便说一下,它是整个Javascript世界中的一个单独主题。
例如,"5!"
翻译为factorial(5)
可以通过以下方式实现:
var result ="5!".replace(/([\d]+)(!)/g,
function(match,number,functionType){
if (functionType === "!"){
return parseInt(number) *2; // perform your math operation here!
}
});
console.log(result);
Mozilla Developer website有很多有用的文档可以指导您完成此主题和其他主题。在上面的链接中,您将找到一个示例,使用RegEx将华氏度转换为其等效的摄氏度,这似乎与您尝试的不同。
关于上面使用的正则表达式( /([\d]+)(!)/g
),可以将其读作:
[\d]+
匹配 !
希望这有帮助!
答案 1 :(得分:1)
虽然它对于首发JS来说非常复杂。正则表达式是一个非常强大的工具,但不是我推荐给初学者的东西,它们看起来很痛苦!实际上你必须做一些考虑。对于初学者来说,需要一个分隔符,以便更容易地分离部件并准确地读取单个功能。一个简单的空间可以做到这一点。
然后,您可以将部件拆分为数组,并通过检测功能和变量的解释器功能循环部件。
让你前进的东西:
var stack = Array(); /* Stack array for calculation */
var result; /* output init */
/* get string from HTML element */
var foostring = document.getElementById("htmlelementID").value; /* "5 !" */
/* split string into array using space as the separator */
var fooarray = foostring.split(" "); /* ["5","!"] */
while(i<fooarray.length)
{
/*calculation loop */
if(!isNaN(fooarray[i])) /* input is number, add to stack */
{
stack.push(Number(fooarray[i]); /* make sure we convert from string to number before storing */
}
else /*input is function, pop required variables from stack and calculate*/
{
switch(fooarray[i])
{
case "!":
var input = stack.pop();
var sum = factorial(input);
stack.push(sum);
break;
default:
console.log("Syntax Error! "+fooarray[i]);
return;
}
}
i++;
}
if(stack.length === 1)
{
alert("Result: " + stack.pop());
}
else
{
console.log("Syntax Error! Too many items on stack at complete");
}
/* math functions */
function factorial (n) {
if (n == 0 || n == 1)
return 1;
if (f[n] > 0)
return f[n];
return f[n] = factorial(n-1) * n;
}
我对postfix知之甚少,这是基于伪算法@ http://en.wikipedia.org/wiki/Reverse_Polish_notation
功能正常但未经测试。您需要使用所需的所有其他功能扩展开关盒,但要注意我放入的示例盒的布局!使用堆栈弹出来从堆栈中移除变量并堆叠推送以将结果添加回堆栈,并且不要忘记每个案例结束时的中断。
欢迎来到JS! =)