3

いくつかの値の長さをチェックする変数があります。失敗した場合は、var passに設定されfalseます。別の関数は、電子メールアドレスの有効性をチェックし、テストに合格しなかった場合はfalseに設定します。カスタムエラーメッセージを作成しようとしています。

このような三項演算子を使用するか、ネストされたifステートメントを使用する方がよいでしょうか。それとも、もっと簡単な方法はありますか?

var mail = true;
var pass = true;
var err = '';

(mail && pass) ? err = 'mail and pass both true' : (!mail && pass) ? err = 'not mail and is pass' : (mail && !pass) ? err = 'is mail and not pass' : err = 'neither pass nor mail';

フィドル

4

5 に答える 5

7

「より良い」は本質的に価値判断であるため、それはあなた次第です。三元バージョンを見て、if/elseバージョンを見て、どちらがより読みやすく、保守可能で、明確であるかを判断します。それはあなたが選ぶべきものです。コンパイラーにとっては問題ではありません。コンパイラーは、関係なく非常に効率的な処理を実行することになります。

于 2012-10-24T21:29:17.087 に答える
3

遭遇する可能性のある唯一の構文上の問題は、三項演算子の結合性です。あいまいさを減らすために角かっこを使用すると役立ちます。

主な問題は、その行が人間にはほとんど読めないことです。ネストされたifは、読みやすく、保守もはるかに簡単です。2か月後にその行に戻って、それを解読しようとしていると想像してみてください。

于 2012-10-24T21:30:01.437 に答える
1

コードを明確にするために、if \else..を使用します。

于 2012-10-24T21:29:52.483 に答える
1

ルックアップテーブルに少し似ている、使用できる優れたイディオムがあります。

var mail = true;
var pass = true;
var err = '';

err = ( mail &&  pass)  ?  'mail and pass both true' 
    : (!mail &&  pass)  ?  'not mail and is pass'
    : ( mail && !pass)  ?  'is mail and not pass' 
    :                      'neither pass nor mail';

もちろん、どちらが優れているかはすべて主観的ですが、唯一のアクションが単一の変数に割り当てられている場合、これは一連のifステートメントを置き換えるための優れた方法です。

とは言うものの、それは、1行の3値の本質的な判読不能性に対処しながら、3値の視覚的なコンパクトさを兼ね備えています。欠点として、後のコードでブール値に従って式を選択する以上のことを行う必要がある場合は、とにかくこれをif-elseステートメントにリファクタリングする必要があります...

于 2012-10-24T21:44:58.963 に答える
0

既存の回答にはすでにいくつかの良い考えがあります。包括性のために、ここに宣言型のソリューションがあります。

http://jsfiddle.net/Shedal/4SfTj/1/

var statusStrings = {
    true: {
        true: 'mail and pass both true',
        false: 'is mail and not pass'
    },
    false: {
        true: 'not mail and is pass',
        false: 'neither pass nor mail'
    }
}

var mail = true;
var pass = true;
var err = statusStrings[mail][pass];

document.write(err);
于 2012-10-24T21:35:08.180 に答える