Javascript 是否自动将条件运算符替换为if/else?
特定的JS解析器(不在我的控制范围内)不理解嵌套条件运算符语法,如下所示:Javascript 是否自动将条件运算符替换为if/else?,javascript,regex,replace,conditional-operator,Javascript,Regex,Replace,Conditional Operator,特定的JS解析器(不在我的控制范围内)不理解嵌套条件运算符语法,如下所示: return num === 1 ? condition ? condition : something : something; 因此,我想用if/else块替换文件中的所有条件运算符(简单和嵌套)。我该怎么做呢?(Textmate或类似文件的regexp会有所帮助。) 我该怎么做呢?(Textmate或类似文件的regexp会有所帮助 我认为正则表达式不可能做到这一点——你需要用它们解析整个JS表达式语法。当然,你
return num === 1 ? condition ? condition : something : something;
因此,我想用if/else块替换文件中的所有条件运算符(简单和嵌套)。我该怎么做呢?(Textmate或类似文件的regexp会有所帮助。)
我该怎么做呢?(Textmate或类似文件的regexp会有所帮助
我认为正则表达式不可能做到这一点——你需要用它们解析整个JS表达式语法。当然,你可以用它们来查找三元运算符的外观,但替换它们需要手工完成
这是因为条件运算符形成表达式,而if/else结构是语句。这意味着您需要在if-else周围提升包含三元运算符的语句。有两种解决方案可以转换一般表达式
if(
条件){
}其他{
}
var-helper;
if(
条件)
helper=
然后是表达式;
else
helper=
else表达式;
选择哪一个取决于some语句的复杂性(对于
返回的-语句,我会选择#1)。由于替换带来了自己的语法规则,您甚至可能需要调整周围的块。所有这些都不是一项简单的任务,只有在您已经有一个解析的AST进行转换的情况下,imho才能实现自动化。一个想法是将x?y:z
转换为(x&&y)| | z
。您可能仍然需要进行一些相当奇特的解析来找到三元运算符,但至少可以将它们作为表达式而不是语句,这意味着所需的更改要少得多。但是,请注意,在某些情况下,这两种情况可能并不完全相同(例如,如果y
为0),请谨慎使用此方法,并且仅当您可以控制将应用于哪些代码时
(x&y)的思想| | z
是当x为真时,它计算为y,当x为假时,它计算为z。这是由于JavaScript处理非布尔值短路的一些边缘情况。这是标准布尔算术的一种推广。本质上,JavaScript将返回检查i所需的最后一个值n为了执行该操作。因此true&&(stuff)
返回stuff
,而false&&(stuff)
返回false
。同样true | |(stuff)
返回true
,而false | |(stuff)
返回stuff
有两种情况需要检查,以表明(x&&y)| | z
(大部分)做了我们想要的事情:
案例1:x是真实的
由于x是真实的,(true&&y)| | z
的计算结果为y | | z
。如果y也是真实的,则计算结果为y,我们得到所需的行为。如果y不是真实的,则操作失败,我们得到z
案例2:x是假的
由于x是假的,(false&&y)| | z
的计算结果为false | | z
,这反过来又会计算为z
。在这里,我们很幸运,不管y是什么,都能获得所需的行为
例子
以下是chrome控制台中所需行为的示例:
> var x1 = "a" //truthy
> var x2 = "" //falsey
> var y = "y"
> var z = "z"
> (x1 && y) || z
"y"
> (x2 && y) || z
"z"
请注意y
不真实的情况
> var y2 = 0
> (x1 && y2) || z
"z"
因此它是有效的(try1?2?3:4:5
),但子表达式中的返回值看起来可疑(try1?2?3:return 4:return 5
)“@chris Fair,只是在试验它——我不确定。至于返回值
s,我想他基本上是指exp的值为'yield'。不过,将内部表达式括起来比完全改为if
/else
@ChrisJester-Young,对不起,子表达式中的返回值不是为了b问题只是用if/else替换条件运算符表达式。代码是有效的JS。你是说if(x){return y;}else{return z;}
?@bowl0stu我不知道你的意思。那将是一个语句而不是一个表达式,对吗?通过坚持使用短路布尔运算,你可以将它保留为一个表达式。我不理解(x&&y)的用途| | z
。想解释一下吗?@bowl0stu当然,我在答案上加了一个解释,如果有什么东西不干净,请告诉我。伙计。以前从未听说过短路;有趣的概念