1

私は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、これらの 1 つ以上のネスト、括弧の使用法、およびコンマによって完全に混乱しています。

誰がこれが何を考えているか推測できますか?サンプルの使用法さえありません:/呼び出しにバグがあるため...

m = c == '@私はまた、条項がm = c ;続くように理解されるべきか、c == '@'それともそれであるかについて疑問を持っていますm = condition ? value if true : value if false) ?

ここでのコンマの使用法は、; を使用することと同じです。?

目的はいくつかの特殊文字 @ と _ を削除することだと思いますが、それはとても複雑です!

ifこの 1 つのライナーではなく、明確な条項を含む多くの行が必要です。

ありがとうございました

4

1 に答える 1

1

三項演算子ステートメントはいつでも再フォーマットして、読みやすくすることができます。if書式設定は、読みやすくする理由の 1 つです。

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

于 2013-03-27T18:35:07.830 に答える