Javascript 了解JS非显而易见的oneliner。逗号分隔符

Javascript 了解JS非显而易见的oneliner。逗号分隔符,javascript,Javascript,我不理解这一行javascript: (i是循环计数器) 我能理解值==其他?true:false技巧,但我完全被其中一个的嵌套、括号和逗号的使用弄得一团糟 有人能猜出这是怎么想的吗?我甚至没有一个示例用法:/ 我还对m=c=='@子句有疑问,它必须理解为m=c后跟c=='@'还是m=条件?值(如果为真):值(如果为假) 这里逗号的用法是否与 我想我们的目的是脱掉一些特殊的角色,但这太复杂了 我希望有很多行带有clearif子句,而不是这一行 谢谢您可以随时重新格式化三元运算符语句,使其更具可读

我不理解这一行javascript:

(i是循环计数器)

我能理解
值==其他?true:false
技巧,但我完全被其中一个的嵌套、括号和逗号的使用弄得一团糟

有人能猜出这是怎么想的吗?我甚至没有一个示例用法:/

我还对
m=c=='@
子句有疑问,它必须理解为
m=c后跟
c=='@'
还是
m=条件?值(如果为真):值(如果为假)

这里逗号的用法是否与

我想我们的目的是脱掉一些特殊的角色,但这太复杂了

我希望有很多行带有clear
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)。

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

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)。

编写该代码的人似乎在尝试验证给定字符串是否为有效的电子邮件id,尽管这是一种糟糕的方法。应该使用正则表达式。@tea_totaler你有一个适合JS的正则表达式模式吗?编写该模式的人应该是shot。代码似乎在尝试验证给定的字符串是否为有效的电子邮件id,尽管这样做很糟糕。应该使用正则表达式。@tea\u totaler你有一个适合JS的正则表达式模式吗?