理解一个JS不明显的在线程序.逗号分隔符

understand a JS non obvious oneliner. Comma separator

本文关键字:在线 程序 分隔符 不明显 JS 一个      更新时间:2023-09-26

我看不懂这行javascript:

(i是一个循环计数器)

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的技巧,但是我完全被其中一个的嵌套,括号和逗号的使用搞糊涂了。

有谁能猜出这个想法是做什么的吗?我甚至没有一个示例用法:/因为调用有bug…

我对m = c == '@条款也有疑问,它应该理解为m = c ;后面跟着c == '@'还是m = condition ? value if true : value if false) ?

是逗号在这里的用法与使用a相同;

?

我认为目的是剥离一些特殊字符@和_,但它是如此复杂!

我希望有许多行明确的if子句,而不是这一行

谢谢

您总是可以重新格式化三元操作符语句以使其更具可读性。格式化是您发现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的优势。还要注意,大括号()严格来说是不必要的,但它们增加了代码的可读性(IMHO)。