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

时间:2011-12-30 12:06:35

标签: javascript jquery

我正在使用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 个答案:

答案 0 :(得分:3)

如果你扔掉所有细节,你案件中正在执行的是:

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

重点是new String不是原始字符串而是字符串 object ,并且传递 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 ); } 正在执行following check

for in

这意味着它对字符串执行var x = new String("abc"); for(var i in x) { console.log(i, x[i]); } // 0 "a" // 1 "b" // 2 "c" 循环,这确实将每个字符分别放在查询字符串中。

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

{{1}}

答案 1 :(得分:1)

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

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

此处提供更多信息(包括为什么您可以将一系列字符发布到服务器): http://www.devguru.com/technologies/ecmascript/quickref/string.html

答案 2 :(得分:1)

JavaScript distinguishes between a literal string and an object of type String
我怀疑当jQuery post方法检查你发送的数据对象时,它会检查typeof每个值是否为string。如果是的话,它的工作就完成了。如果它找到一个Object(它是一个String),它会迭代它 - 这就是你获得一个字符数组的原因。

如果您有String对象,则可以使用String.valueOf()来获取原始值

答案 3 :(得分:1)

你永远不应该在javascript中创建这样的字符串,这被认为是一种不好的做法:

 var x = new String('updateGroup');

但总是喜欢这个

 var x = 'updateGroup';

因为在第一种情况下你创建了一个对象,而在第二种情况下你创建了一个字符串。数组也一样,总是使用

 var array = [];