2011-12-30 4 views
5

jQueryを使ってajax呼び出しを行っていますが、その多くは問題なく動作していますが、奇妙な問題に遭遇して文字列をサーバ。JavaScript StringオブジェクトがjQuery.postの配列に分割されています

var x = new String('updateGroup'); 
var y = 'updateGroup'; 
$.post('page.aspx', { 
    f: x, 
    f2: y 
}, function(data) { 
}); 

それはしかし、サーバーをヒットすると、次のように、リクエスト変数は次のとおりです:

Request["f"]   null   string 
Request["f2"]   "updateGroup" string 
Request.Form.AllKeys {string[12]} string[] 
    [0]     "f[0]"  string 
    [1]     "f[1]"  string 
    [2]     "f[2]"  string 
    [3]     "f[3]"  string 
    [4]     "f[4]"  string 
    [5]     "f[5]"  string 
    [6]     "f[6]"  string 
    [7]     "f[7]"  string 
    [8]     "f[8]"  string 
    [9]     "f[9]"  string 
    [10]    "f[10]"  string 
    [11]    "f2"   string 

Request["f[0]"]"u"が含まれているなど

することができます私はダウンだけで、これにコードを狭くしました誰かがこれがなぜ起こるか説明します。

答えて

3

を使用し、配列のために行く、何をお使いの場合に実行されているのは、次のとおりです。jQuery.ajaxは内部的にAJAXを行うために呼び出す

  • jQuery.post
  • 内部でjQuery.paramを呼び出してクエリ文字列を作成します。

点はnew Stringがプリミティブ文字列が、文字列オブジェクトないことであり、意志パスjQuery.ajaxfollowing checktypeof new String("foo") === "object"、ない"string"):

// Convert data if not already a string 
if (s.data && s.processData && typeof s.data !== "string") { 
    s.data = jQuery.param(s.data, s.traditional); 
} 

jQuery.paramas followsを実行している:

for (var prefix in a) { 
    buildParams(prefix, a[ prefix ], traditional, add); 
} 

これは、文字列に対してfor inループを実行することを意味します。実際には、各文字クエリ文字列で別々に

あなたはこのテストケースで、この動作を確認することができます。

var x = new String("abc"); 

for(var i in x) { 
    console.log(i, x[i]); 
} 

// 0 "a" 
// 1 "b" 
// 2 "c" 
1

あなたは文字列そのものではなく、文字列オブジェクトを作成新しい文字列を使用する場合は、あなたのブラウザーでこれを実行する場合、あなたは彼らが対象と丁重に文字列だが表示されます:

console.log(typeof new String("hello")); 
console.log(typeof "hello"); 

詳細ここに情報(サーバーに投稿された文字の配列を含む理由を含む): http://www.devguru.com/technologies/ecmascript/quickref/string.html

+0

をありがとう - 理にかなっています。私は.toStringと.valueOfを追加しました。両方ともこの問題を回避するようです。 Jqueryが文字列オブジェクトをこのように扱うことは私には奇妙に思えます。 –

+0

Stringオブジェクトは古風な遺物であり、大、太字、点滅、フォントサイズ、fontcolorなどのメソッドがあり、年齢の良いアイデアを与えます;-) – oodavid

1

JavaScript distinguishes between a literal string and an object of type String
jQueryのポスト・メソッドが送信したデータ・オブジェクトを検査しているときに、typeofの各値がstringであるかどうかを確認します。そうであれば、その仕事は完了です。オブジェクト(文字列)が見つかった場合は、そのオブジェクトを反復処理します。そのため、一連の文字を取得しています。

あなたはあなたがJavaScriptでこのような文字列を作成することはありませんプリミティブ値

1

を取得するためにString.valueOf()を使用することができStringオブジェクトを持っている場合、それは悪い習慣と考えられています:

var x = new String('updateGroup'); 

いつものようにこの

最初のケースではオブジェクトを作成し、2番目のケースでのみ文字列を作成するためです。同じことは、あなたが離れてすべての詳細を投げる場合は常に

var array = []; 
+0

賢者はかつてこう言っていました。些細な変数:-) +1 – Flater

+0

文字列オブジェクト自体は、この例から離れたコードのレイヤーから来ていますが、実際には文字列でなければならないのかどうか疑問に思っていますオブジェクトはまったくありません。入力ボックスの.val()から構築されていますが、私はそれがこのようになる理由は見当たりませんので、使用する人の代わりにそのレイヤーを変更してみることにしますvalueOf。 –

関連する問題