特定的JS解析器(不在我的控件中)不理解嵌套的条件运算符语法,如下所示:
return num === 1 ? condition ? condition : something : something;
因此,我想用if / else块替换文件中的所有条件运算符(简单和嵌套)。我该怎么办呢? (Textmate或类似的regexp会有所帮助。)
答案 0 :(得分:5)
我该如何解决? (Textmate或类似的正则表达式会有所帮助。
我不认为这对正则表达式是可行的 - 你需要用它们解析整个JS表达式语法。当然,您可以使用它们来查找三元运算符的外观,但需要手动替换它们。
这是因为条件运算符形成表达式,而if / else结构是语句。这意味着你需要在if-else周围解除包含三元运算符的语句。转换一般
有两种解决方案< some statement ( condition
?
then-expression:
else-expression < / em>)&gt;
if (
条件) {
&lt; some statement then-expression&gt;
} else {
&lt; some statement else-expression&gt;
}
var helper;
if (
条件)
helper =
then-expression;
else
helper =
else-expression;
&lt; some statement
helper
&gt;
选择哪一项取决于某些陈述的复杂性(对于您的return
- 我选择#1的陈述。由于替换带来了自己的语法规则,您甚至可能需要调整周围的块。所有这些都不是一项微不足道的任务,只有当你已经有一个经过解析的AST进行转换时,imho才能自动完成。
答案 1 :(得分:1)
一个想法是将x ? y : z
转换为(x && y) || z
。你仍然可能不得不做一些相当花哨的解析来找到三元运算符,但至少你可以将它们作为表达而不是语句,这意味着所需的更改不那么广泛。但请注意,可能存在这两种情况并不完全等效的情况(例如,如果y
为0),请谨慎使用此方法,并且只有在您可以控制应用的代码时才使用此方法。
(x && y) || z
的想法是,当x为真时,它的计算结果为y,当x为假时,它的计算结果为z。这是由于JavaScript处理非布尔值的短路方式的一些边缘情况。它是标准布尔算术的一种推广。实质上,JavaScript将返回检查所需的最后一个值以执行操作。因此true && (stuff)
会返回stuff
,而false && (stuff)
会返回false
。同样,true || (stuff)
会返回true
,而false || (stuff)
会返回stuff
。
有两种情况需要检查,以显示(x && y) || z
(大部分)做了我们想要的事情:
由于x是真实的,(true && y) || z
评估为y || z
。如果y也是真实的,那么这将评估为y,我们得到了我们想要的行为。如果y不真实,则操作失败,我们得到z!
由于x是假的,(false && y) || z
评估为false || z
,而z
的评估结果为> var x1 = "a" //truthy
> var x2 = "" //falsey
> var y = "y"
> var z = "z"
> (x1 && y) || z
"y"
> (x2 && y) || z
"z"
。在这里,我们很幸运,无论y是什么,总能得到理想的行为。
以下是Chrome控制台中所需行为的示例:
y
请注意> var y2 = 0
> (x1 && y2) || z
"z"
不真实的情况!
var varificetioncode = 'how-to-send-link-on-html-button-click-in-java-mail';
var token = "http://stackoverflow.com/questions/43445571/"+varificetioncode;
message.setContent("<h2>Reset password request </h2>" +
"<h3> Plaese click on the button to reset password \n </h3> "+
" <a target='_blank' href="+token+"><button>Reset your password</button></a>","text/html; charset=utf-8");