JavaScript字符串对象在jQuery.post中被分割成数组

5

我正在使用jQuery进行ajax调用,其中许多调用都可以正常工作,但是在尝试向服务器发送字符串时,我遇到了一个奇怪的问题。 我已将代码缩小到以下内容:

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" 等时,发生了什么?

有人能解释一下为什么会发生这种情况吗?

4个回答

3
如果你忽略所有细节,那么在你的情况下执行的是:
- jQuery.post - 它内部调用jQuery.ajax执行ajax - 它内部调用jQuery.param构建查询字符串
关键是new String不是原始字符串,而是一个字符串对象,并且将通过jQuery.ajax中的以下检查typeof 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.param正在执行如下

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

当你使用 new String 时,你创建的是一个字符串对象而不是一个字符串本身,如果你在浏览器中运行它,你会看到它们分别是一个对象和一个字符串:

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

更多信息请参见此处(包括为什么您可以将字符数组发布到服务器): http://www.devguru.com/technologies/ecmascript/quickref/string.html


谢谢 - 很有道理。我添加了 .toString 和 .valueOf,两者似乎都可以解决这个问题。对我来说,Jquery 这样处理字符串对象似乎很奇怪 - 对我来说似乎不符合直觉。 - James Thorpe
String对象有点过时了,它的方法像big、bold、blink、fontsize、fontcolor等,让你对它的年龄有了一个很好的想法;-) - oodavid

1

JavaScript 区分字面字符串和String类型的对象
我怀疑当jQuery的post方法检查您发送的数据对象时,它会检查每个值的typeof是否为string。 如果是,它的工作就完成了。 如果它发现一个对象(其中一个是String),它会对其进行迭代-这就是为什么您会得到一个字符数组的原因。

如果您有一个String对象,可以使用String.valueOf()获取基本值


1

在JavaScript中,您永远不应该创建这样的字符串,因为它被认为是一种不良实践:

 var x = new String('updateGroup');

但总是这样

 var x = 'updateGroup';

因为在第一种情况下,您创建了一个对象,而仅在第二种情况下创建了一个字符串。对于数组也是如此,始终使用。

 var array = [];

有一位智者曾说过:不要创建琐碎变量的实例 :-) +1 - Flater
字符串对象本身来自于离这个例子一层代码的地方 - 虽然现在我正在重新访问那一层以调查它来自哪里,但我想知道它是否真的需要成为一个字符串对象 - 它是从输入框的.val()构造的,但我没有看到任何理由让它变成这样,所以将考虑更改那一层而不是让每个使用它的人担心使用valueOf。 - James Thorpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接