使用特定字符串调用JavaScript函数

时间:2014-05-30 14:16:49

标签: javascript calculator postfix-notation

是否可以使用特定字符串执行JavaScript函数?

我正在通过编写后缀表示法计算器来学习JavaScript。

示例:如果我写入输入框" 5!",我希望factorial(5)被执行,或者如果我写3nCr5,请执行ncr(3,5)

2 个答案:

答案 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! =)