2016-06-13 56 views
1

我遇到下面的代碼:讀取多個三元運算符條件

 if (proto.hasOwnProperty(name)) { 
     !(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : invariant(false) : undefined; 
     } 

你怎麼讀第2行的三元運算符?

回答

0

嘗試格式化縮進代碼以便更好地理解。

if (proto.hasOwnProperty(name)) { 
    !(
     specPolicy === SpecPolicy.DEFINE_MANY //1 
     || 
     specPolicy === SpecPolicy.DEFINE_MANY_MERGED //1 
    ) ? 
     process.env.NODE_ENV !== 'production' ? //2 
      invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : 
      invariant(false)//3 
     : undefined;//4 
} 

(1)如specPolicy既不SpecPolicy.DEFINE_MANY也不SpecPolicy.DEFINE_MANY_MERGED,然後檢查是否process.env.NODE_ENV不是 「生產」。 (2)如果是,請致電invariant(false, 'Re....,否則請致電(3)invariant(false)。 如果(1)爲真,則返回undefined(4)。

1

正如其中一條評論所說,您應該將其轉換爲傳統的if-else樹以提高可讀性/清晰度。但是,它會讀這樣的(我沒有寫出來逐字爲簡潔起見,但你的要點):

if (!conditionOne) { 
    if (conditionTwo) { 
     return invariant(false, 'ReactClass...', name); 
    } 
    else { 
     return invariant(false); 
    } 
} 
else { 
    return undefined; 
} 

我想通過轉換爲代碼來回答這個問題的的if-else樹可以幫助你更容易理解:)

0

有兩個三元運算符。看看這種格式化它的方式是否有幫助:

!(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? 
    process.env.NODE_ENV !== 'production' ? 
     invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : 
     invariant(false) : 
    undefined; 
0

您可以使用正確的縮進。最內側的三元組合在一起就像

condition1 ? condition2 ? value1 : value2 : value3 

相同

condition1 ? (condition2 ? value1 : value2) : value3 

與您的代碼;

!(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? 
    process.env.NODE_ENV !== 'production' ? 
     invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : 
     invariant(false) : 
    undefined;