2016-06-13 43 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;