为什么jQuery param()以不同的方式编码这些值?

时间:2014-04-10 13:49:28

标签: jquery

我注意到当我将一个字符串数组传递给jQuery的param()时,编码的字符串包含带有编码的下标运算符但没有指定索引的对象成员名称。例如:

var stringA = "The First String";
var stringB = "The Second String";

alert($.param( { pars: [stringA, stringB] } ));

这会产生值: pars%5B%5D = + First + String& pars%5B%5D = + Second + String

但是,如果我传递一个日期数组,则会使用下标运算符和索引发出 pars 成员,就像param()试图向数组指示特定顺序的接收者一样元素。例如:

var dateA = new Date();
var dateB = new Date();

alert($.param( { pars: [dateA, dateA] } ));

这产生的值: pars%5B0%5D = Thu + Apr + 10 + 06%3A50%3A39 + PDT + 2014& pars%5B1%5D = Thu + Apr + 10 + 06%3A50%3A39 + PDT + 2014

注意在每个编码的下标文字中包含索引(即pars [0],而不是第一个示例中的pars [])。

为什么param()表现得这样?

1 个答案:

答案 0 :(得分:1)

这是因为日期具有对象类型,而字符串则没有。

对象可以包含多个值。请参考param文档中的以下示例:

$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 } ] });
// "a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5"

如您所见,所有基元在编码结果中都没有索引。对象有。

这是有道理的,因为基元只有一个值,需要编码,而对象可以有多个。使用上面的例子:

$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5, f: 6 } ] });
// "a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5&d[2][f]=6"

// Consider how this is different from:
$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 }, { f: 6 } ] });
// "a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5&d[3][f]=6"

解码函数需要能够区分d[2]d[3],但我们并不关心区分原语的索引。

参考:https://api.jquery.com/jQuery.param/