34
$(document).ready(function(){

    createForm("text,password",".content");  

});

function createForm(types,object){

    typ = types.split(',');

    //var source = "";

    $.each(typ,function(){

        switch(this){

            case "text":
            console.log('text');break;
            default: console.log('default');break;
        }


    });
    //$(object).html(source);
}

私はこのコードをコンソールに持っており、2xdefaultsを返します。なんで?

タイプごとに入力をテキストまたはパスワードとして返そうとしましたが、スイッチが「タイプ」を認識しません

4

4 に答える 4

35

この動作が見られる理由は、呼び出しthis内に文字列プリミティブではなくオブジェクトインスタンスがあるためです。JavaScriptには両方があります。ステートメントでは、ケースとの比較はを介して行われ、文字列インスタンスは文字列プリミティブに対するものではありません。eachStringswitch======

それを修正する3つの方法:

  1. スイッチを次のように変更した場合:

    switch (String(this)) {
    

    ...それはそれを原始的なものに戻し、あなたのswitch作品になります。

  2. 以下のコメントでVisioNが指摘しているように、渡す引数を使用します($.each各文字列は、プリミティブとして、2番目の引数として提供されます)。

    $.each(typ, function(index, value) {
        switch (value) {
            // ...
        }
    });
    
  3. この他の回答で説明されている代替案のいずれかを使用してください(そのうちの1つは素晴らしい単純なforループです)。


補足:変数を宣言しないことで、暗黙のグローバルの恐怖のtyp餌食になります。

于 2013-02-16T13:25:16.613 に答える
9

jQueryはここではやり過ぎです。とにかくjQueryでそれを行う正しい方法については、TJCrowdersの回答を参照してください。

標準のループを使用することで、はるかに簡単な方法をお勧めしforます。それはうまくいきます:

var types = "text,password".split(",");
for (var i = 0; i < types.length; i++) {
    switch(types[i]){
        case "text":
            console.log('text');
        break;
        default: 
            console.log('default');
        break;
    }
}
于 2013-02-16T13:23:35.867 に答える
6

関数の使い方を$.each間違えました。次のようになります。

$.each( typ, function( key, value ) {
    switch(value){

       case "text":
            console.log('text');break;
       default:
            console.log('default');break;
    }
});
于 2013-02-16T13:25:38.627 に答える
1

switch(String(this))の代わりに使用してみてくださいswitch(this)。そしてもちろん、変数を初期化します。

于 2013-02-16T13:26:17.383 に答える