1

我不明白这行 javascript :

(我是一个循环计数器)

var m;

t[i] == '@' ? m = '' : t[i] == '_' ? m = null : (c = t[i].charAt(0), m = c == '@' || c == '_' ? t[i].substring(1) : t[i])

我可以理解这个value == other ? true : false技巧,但是我完全被其中一个的嵌套、括号的使用和逗号的使用弄得一团糟。

谁能猜出这是怎么想的?我什至没有示例用法:/因为调用是错误的...

我也对该m = c == '@条款有疑问必须将其理解为m = c ;紧随其后c == '@'还是m = condition ? value if true : value if false) ?

此处逗号的用法与使用 a 相同;?

我认为这样做的目的是去除一些特殊的字符 @ 和 _ 但它太复杂了!

我希望有许多带有明确if条款的行,而不是这一行

谢谢你

4

1 回答 1

1

您始终可以重新格式化三元运算符语句以使其更具可读性。格式化是您发现if更具可读性的原因之一:

t[i] == '@' ?
    m = '' :           // if it's an @
    t[i] == '_' ?      // else:
        m = null :     // if it's a _
        (              // else:
             c = t[i].charAt(0), // c = first character
             m =                 // m = one of the following:
                 c == '@' || c == '_' ?   // if @ or _ is first character
                     t[i].substring(1) :  // the string minus @ or _
                     t[i]                 // else the string itself
        )

请注意,最外面的三元运算符的结果被丢弃,这是非常非常难看的代码。相反,它滥用了三元运算符的条件部分可以是一个表达式并在那里对 m 进行赋值的事实。

基本上上面是一种复杂的写作方式:

if (t[i] =='@') {
    m = '';
}
else if  (t[i] =='_') {
    m = null;
}
else {
    m = t[i].replace(/^[@_]/,''); // replace leading @ or _ with nothing
}

如果您仍然需要使用三元运算符并且没有正则表达式,则更好的实现将是:

var str = t[i];
var c = str.charAt(0);

m = str == '@' ?             // if @
        '' :
    str == '_' ?             // if _
        null :
    (c == '@' || c == '_') ? // if starts with @ or _
        str.substring[1] :
                             // else don't modify the string
        str;

请注意,在上面的语句中,我们将三元运算符的结果分配给,m而不是在任何评估的语句中进行分配。这首先是三元运算符的优势if。另请注意,大括号()严格来说不是必需的,但它们增加了代码的可读性(恕我直言)。

于 2013-03-27T18:35:07.830 回答