在javascript中反复循环

在javascript中反复循环,javascript,Javascript,考虑到操作的优先级,我正在编写计算器的代码。 我试图做的是替换与我编写的正则表达式匹配的优先级并计算它,然后循环遍历它,直到字符串的长度(最初是输入)变为1 下面是我的代码,但运行它会导致无限循环 常量计算器=函数{ this.evaluate=string=>{ 让正则表达式=/\\d++\s[*/+-]\s\d++\\\\\d++\s[*/]\s\d++\d++\s[+-]\s\d+/g whilestring.length>1{ string.replaceregex,cal; } 返回字

考虑到操作的优先级,我正在编写计算器的代码。 我试图做的是替换与我编写的正则表达式匹配的优先级并计算它,然后循环遍历它,直到字符串的长度(最初是输入)变为1

下面是我的代码,但运行它会导致无限循环

常量计算器=函数{ this.evaluate=string=>{ 让正则表达式=/\\d++\s[*/+-]\s\d++\\\\\d++\s[*/]\s\d++\d++\s[+-]\s\d+/g whilestring.length>1{ string.replaceregex,cal; } 返回字符串; } }; 函数演算{ let temp=参数。拆分“”; 设regexP=/\\d+\d+\/g iftemp[0]。matchregexP{ 温度[0]=温度[0]。切片1; 温度[2]=温度[2]。切片0,1; } 开关温度[1]{ 大小写“+”:返回+temp[0]++temp[2]; 案例'-':返回+温度[0]-+温度[2]; 案例'*':返回+临时[0]*+临时[2]; 案例“/”:返回+temp[0]/+temp[2]; 默认:返回未定义; } } 让我们来计算一下新的计算器 console.logcalculate.evaluate2/2+3*4-6; 出于某种原因,代码在一次又一次地循环,并且没有返回值

我做错了什么?我该如何修复它?

您需要

1将调用的结果赋值。替换为字符串Javascript字符串不可变:

string.replace(regex, cal);
2结果字符串可以完成所有+-*/操作,但长度仍然大于1,例如,如果结果为3*4,则结果为12。改为使用while/[-+*/]/.teststring{:

常量计算器=函数{ this.evaluate=string=>{ 让正则表达式=/\\d++\s[*/+-]\s\d++\\\\\d++\s[*/]\s\d++\d++\s[+-]\s\d+/g 而/[-+*/]/.teststring{ string=string.replaceregex,cal; } 返回字符串; } }; 函数演算{ let temp=参数。拆分“”; 设regexP=/\\d+\d+\/g iftemp[0]。matchregexP{ 温度[0]=温度[0]。切片1; 温度[2]=温度[2]。切片0,1; } 开关温度[1]{ 大小写“+”:返回+temp[0]++temp[2]; 案例'-':返回+温度[0]-+温度[2]; 案例'*':返回+临时[0]*+临时[2]; 案例“/”:返回+temp[0]/+temp[2]; 默认:返回未定义; } } 让我们来计算一下新的计算器 console.logcalculate.evaluate2/2+3*4-6;您需要

1将调用的结果赋值。替换为字符串Javascript字符串不可变:

string.replace(regex, cal);
2结果字符串可以完成所有+-*/操作,但长度仍然大于1,例如,如果结果为3*4,则结果为12。请改用while/[-+*/]/.teststring{

常量计算器=函数{ this.evaluate=string=>{ 让正则表达式=/\\d++\s[*/+-]\s\d++\\\\\d++\s[*/]\s\d++\d++\s[+-]\s\d+/g 而/[-+*/]/.teststring{ string=string.replaceregex,cal; } 返回字符串; } }; 函数演算{ let temp=参数。拆分“”; 设regexP=/\\d+\d+\/g iftemp[0]。matchregexP{ 温度[0]=温度[0]。切片1; 温度[2]=温度[2]。切片0,1; } 开关温度[1]{ 大小写“+”:返回+temp[0]++temp[2]; 案例'-':返回+温度[0]-+温度[2]; 案例'*':返回+临时[0]*+临时[2]; 案例“/”:返回+temp[0]/+temp[2]; 默认:返回未定义; } } 让我们来计算一下新的计算器
console.logcalculate.evaluate2/2+3*4-6;CertainPerformance已经指出了导致意外行为的错误

为了获得正确的优先级,您应该首先解析所有括号,然后是乘法/除法,然后是加法/减法

您可以使用三个正则表达式来分别处理这一个正则表达式,并使用递归来处理括号内的任何表达式。请注意,这样的子表达式不需要仅仅是一个操作。它可能有更多的操作,甚至是括号。因此,最好从内到外解析括号

以下是如何调整代码以实现此目的:

常量计算器=函数{ 常数cal=a,op,b=>{ 开关{ 大小写“+”:返回+a++b; 案例'-':返回a-b; 案例“*”:返回a*b; 案例“/”:返回a/b; 大小写:return+this.evaluatea;//使用递归解析括号 } }; this.evaluate=string=>{ 设正则表达式=[ /\[^]+\/g,//优先级1:括号 /-?\d+?:\。\d+?\s*[*\/]\s*-?\d+?:\。\d+?/,//优先级2:乘法和除法 /-?\d+?:\。\d+?\s*[+-]\s*-?\d+?:\。\d+?/,//优先级3:加减法 ]; 对于正则表达式中的let正则表达式{ 让发现; 做{ 发现=错误; string=string.replaceregex,,…args=>{ 发现=真; 返回cal…args.toFixed12; }; }发现时; } 返回字符串; }; }; 让我们来计算一下新的计算器
console.log+calculate.evaluate2/2+3*4-6 CertainPerformance已经指出了导致不良行为的错误

为了获得正确的优先级,您应该首先解析所有括号,然后是乘法/除法,然后是加法/减法

您可以使用三个正则表达式来分别处理这一个,并使用递归来处理括号内的任何表达式。请注意,这样的子表达式不需要只是一个操作。它可以有更多的操作,甚至括号。因此,括号最好是由内而外解析

以下是如何调整代码以实现此目的:

常量计算器=函数{ 常数cal=a,op,b=>{ 开关{ 大小写“+”:返回+a++b; 案例'-':返回a-b; 案例“*”:返回a*b; 案例“/”:返回a/b; 大小写:return+this.evaluatea;//使用递归解析括号 } }; this.evaluate=string=>{ 设正则表达式=[ /\[^]+\/g,//优先级1:括号 /-?\d+?:\。\d+?\s*[*\/]\s*-?\d+?:\。\d+?/,//优先级2:乘法和除法 /-?\d+?:\。\d+?\s*[+-]\s*-?\d+?:\。\d+?/,//优先级3:加减法 ]; 对于正则表达式中的let正则表达式{ 让发现; 做{ 发现=错误; string=string.replaceregex,,…args=>{ 发现=真; 返回cal…args.toFixed12; }; }发现时; } 返回字符串; }; }; 让我们来计算一下新的计算器

console.log+calculate.evaluate2/2+3*4-6;哇!我从你那里学到了很多。谢谢你的纠正,给了我另一个视角!我能再问一个问题吗?这个问题很抽象,但我想问你这个问题。代码看起来效率低吗?因为我在Codewars中提交代码,我用它来进行代码质询,它不断地抛出消息执行超时不,它不是特别低效。不太好,但也不错。可以通过标记字符串或使用eval来提高效率,但如果提交超时,则存在一些您没有考虑的输入可能性。如果您在问题中发布不起作用的输入,我们可以看到它们是什么,并尝试修复它们。奇怪的是,样本测试通过了,但超时了,之后就没有测试了。因为它应该在另一个样品通过之前通过。谢谢你的意见。我已经自学JS三个月了,我很高兴我能帮助像你这样的人!我会再自己想办法的!样本测试不是真正的测试,对吗?听起来好像示例测试通过了,但实际测试遇到了逻辑错误和无限循环。我从你那里学到了很多。谢谢你的纠正,给了我另一个视角!我能再问一个问题吗?这个问题很抽象,但我想问你这个问题。代码看起来效率低吗?因为我在Codewars中提交代码,我用它来进行代码质询,它不断地抛出消息执行超时不,它不是特别低效。不太好,但也不错。可以通过标记字符串或使用eval来提高效率,但如果提交超时,则存在一些您没有考虑的输入可能性。如果您在问题中发布不起作用的输入,我们可以看到它们是什么,并尝试修复它们。奇怪的是,样本测试通过了,但超时了,之后就没有测试了。因为它应该在另一个样品通过之前通过。谢谢你的意见。我已经自学JS三个月了,我很高兴我能帮助像你这样的人!我会再自己想办法的!样本测试不是真正的测试,对吗?听起来好像样本测试通过了,但是真正的测试遇到了逻辑错误和无限循环。谢谢你的帮助,给了我一个很好的视角!现在我试着将其与我的进行比较。如果您需要更多帮助,可以指向/链接到您正在查看的特定codewars kata,因为有几种变体,每种变体都有其特定的要求/假设。。100多个测试中有3个失败。只有一个问题是,在replace方法中,下划线的作用是什么?我更新了答案以通过这3个测试。问题是,对于非常大的数字,默认的字符串强制将插入科学符号。所以我做了一些修改,主要是使用toFixed来避免科学符号的出现。不,不,我真的很感谢你的帮助。我一直有麻烦
或者这件事太久了。所以我非常感谢你的帮助,谢谢你的帮助,给了我一个很好的视角!现在我试着将其与我的进行比较。如果您需要更多帮助,可以指向/链接到您正在查看的特定codewars kata,因为有几种变体,每种变体都有其特定的要求/假设。。100多个测试中有3个失败。只有一个问题是,在replace方法中,下划线的作用是什么?我更新了答案以通过这3个测试。问题是,对于非常大的数字,默认的字符串强制将插入科学符号。所以我做了一些修改,主要是使用toFixed来避免科学符号的出现。不,不,我真的很感谢你的帮助。这件事我已经有麻烦很久了。所以我非常感谢你的帮助