Javascript 在此块中用if/else替换嵌套的条件运算符
使用if/else语句而不是三元语句,这个块看起来会是什么样子 返回值==null?名字,本地人?attrNullNS:attrNull:typeof 值=“函数”?名字,本地人?AttrFunctions:attrFunction: 名字,本地人?attrconstants:attrConstantJavascript 在此块中用if/else替换嵌套的条件运算符,javascript,conditional-operator,Javascript,Conditional Operator,使用if/else语句而不是三元语句,这个块看起来会是什么样子 返回值==null?名字,本地人?attrNullNS:attrNull:typeof 值=“函数”?名字,本地人?AttrFunctions:attrFunction: 名字,本地人?attrconstants:attrConstant (在处理另外15个类似的块之前,我想确定我是否正确地执行了此操作……理想情况下,我想用一个regexp替换所有这些块,但似乎没有方法?仅通过替换三元运算符就可以快速完成此操作,但我猜它看起来非常像
(在处理另外15个类似的块之前,我想确定我是否正确地执行了此操作……理想情况下,我想用一个regexp替换所有这些块,但似乎没有方法?仅通过替换三元运算符就可以快速完成此操作,但我猜它看起来非常像这样:
if (value == null) {
if (name.local) {
return attrNullNS;
}else{
return attrNull;
}
}else if (typeof value === "function") {
if (name.local) {
return attrFunctionNS;
}else{
return attrFunction;
}
}else{
if (name.local) {
return attrConstantNS;
}else{
return attrConstant;
}
}
好问题
首先,我同意给您留下这段代码的开发人员应该受到惩罚
但是,如果你考虑到这一点,你可以理解(没有代码格式,如In)。
属于同一原子条件运算的相邻表达式不能由两侧的?
s或:
s分隔,因为语法不允许这样做。因此,只需将自己置于根据ECMAScript语法工作的LL(n)解析器的位置;-)反复问自己这样一个问题:“该代码是否可以由目标符号的产品生成?”;如果答案是“否”,则返回到较短的匹配项,直到它可以,或者如果没有生产工作,则返回到语法错误
返回(
值==null?name.local?attrNullNS:attrNull:typeof value==“function”?name.local?attrnfunctions:attrnfunction:name.local?attrConstantNS:attrConstant
<代码>
返回(value==null?
(
)
:
(
值的类型==“函数”?名称.local?attrnfunctions:attrnfunction:name.local?attrConstantNS:attrcconstant
)
)代码>
返回(
(
)
?(name.local?attrnulns:attrNull):(
)
<(
name.local?attrFunctions:attrFunction
)
:
(
name.local?attrConstantNS:attrConstant
)
);
if (value == null)
{
if (name.local)
{
return attrNullNS;
}
else
{
return attrNull;
}
}
else
{
if (typeof value === "function")
{
if (name.local)
{
return attrFunctionNS;
}
else
{
return attrFunction;
}
}
else
{
if (name.local)
{
return attrConstantNS;
}
else
{
return attrConstant;
}
}
}
(CMIIW.)这可以进一步减少到
if (value == null)
{
if (name.local)
{
return attrNullNS;
}
return attrNull;
}
if (typeof value === "function")
{
if (name.local)
{
return attrFunctionNS;
}
return attrFunction;
}
if (name.local)
{
return attrConstantNS;
}
return attrConstant;
三元运算符和无块if-else语句的语法(“分组”)非常相似,因此您可以先用if(…)替换每个…?
和每个:
使用else
。然后将return
语句包装在每个语句周围,并使用自动缩进。也许您甚至可以通过自动替换小心地(一步一步地)完成其中的一些任务。您最终会
if (value == null)
if (name.local)
return attrNullNS;
else
return attrNull;
else if (typeof value === "function")
if (name.local)
return attrFunctionNS;
else
return attrFunction;
else if (name.local)
return attrConstantNS;
else
return attrConstant;
希望它们最终会包含大括号。@PointedEars:如果您认为它们可以提高可读性,您的自动缩进应该可以添加它们。我之所以省略它们是为了表明我的观点,即无大括号条件语句非常类似于无大括号三元运算符。您在说什么?单靠自动缩进是无法实现的自动添加大括号。比可读性更重要的是可维护性。当不止一条语句依赖于条件表达式时,此代码就会开始失败。@PointedEars:好的,不仅仅是缩进,而是编辑器的整理/漂亮打印/任何功能。当然,一个条件表达式中只允许一条语句如果不是,但由于原始的三元运算符具有相同的限制,这在这里不是问题-对于转换来说。如果您需要在以后修改代码,大括号可能会很有用,这一点很清楚。