JavaScript String对象被分割成jQuery.post上的数组

Jam*_*rpe 5 javascript jquery

我正在使用jQuery来执行ajax调用 - 其中许多工作正常,但我只是遇到一个奇怪的问题,试图将字符串发送到服务器.我已经将代码缩小到这样:

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

但是当它命中服务器时,请求变量如下:

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
Run Code Online (Sandbox Code Playgroud)

哪里Request["f[0]"]包含"u"

有人可以解释为什么会这样吗?

pim*_*vdb 3

如果您丢弃所有详细信息,那么您的案例中正在执行的内容是:

  • jQuery.post
  • jQuery.ajax内部调用来执行ajax
  • jQuery.param在内部调用来构建查询字符串

关键是它new String不是一个原始字符串,而是一个字符串对象,并且将通过以下检查jQuery.ajaxtypeof 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 );
}
Run Code Online (Sandbox Code Playgroud)

jQuery.param执行如下

for ( var prefix in a ) {
    buildParams( prefix, a[ prefix ], traditional, add );
}
Run Code Online (Sandbox Code Playgroud)

这意味着它对for in字符串进行循环,这确实将每个字符单独放入查询字符串中。

您可以使用此测试用例检查此行为:

var x = new String("abc");

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

// 0  "a"
// 1  "b"
// 2  "c"
Run Code Online (Sandbox Code Playgroud)