好問題。
首先,我同意,誰離開你這個代碼的開發應該LARTed。
但是,如果您考慮到the syntax for the Conditional Operator is LogicalORExpression ? AssignmentExpression : AssignmentExpression
or … : AssignmentExpressionNoIn
和the longest possible match wins,則可以計算出該結果(無代碼格式化程序,如Eclipse JSDT)。
屬於相同的原子條件運算表達式相鄰,但無法通過?
S或:
S於都雙方劃定,因爲語法不允許。所以只要把自己成作品根據ECMAScript的語法;-)反覆問自己這個問題:「可以將此代碼由生產該目標的符號產生的?」一個LL(N)解析器的位置;如果答案是「否」,則回溯到較短的匹配,直到它可以,否則如果沒有生產工作,則會出現語法錯誤。
return
(
value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant
)
;
return (value == null ?
(
name.local ? attrNullNS : attrNull
)
:
(
typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant
)
);
return (
(
value == null
)
? (name.local ? attrNullNS : attrNull) : (
(
typeof value === "function"
)
?
(
name.local ? attrFunctionNS : 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;
希望他們最終會得到含有大括號的東西。 – PointedEars
@PointedEars:如果您認爲它們提高了可讀性,那麼您的自動縮進應該能夠添加它們。我故意忽略它們來表明我的觀點,即無條件的條件語句非常像無支撐的三元運算符。 – Bergi
你在說什麼?自動縮進本身*不能*自動添加大括號。比可讀性更重要的是可維護性。當不僅有一條語句依賴於條件表達式時,此代碼將開始失敗。 – PointedEars